63 - Función strftime para dar formatos a fechas y horas

Hemos visto como almacenar fechas en un campo de tipo text en SQLite. Ahora veremos como podemos darle un formato particular según la necesidad de nuestra aplicación cuando la recuperamos.

La función strftime nos ayuda a dar un formato particular cuando recuperamos una fecha.

Veremos con un ejemplo la sintaxis de esta función.

Problema resuelto

Trabajamos con la tabla "asistencia". Si existe la eliminamos:

drop table if exists asistencia;

Creamos la tabla con la siguiente estructura:

create table asistencia(
  dni text,
  fechahora text,
  primary key (dni, fechahora)
);

Definimos el campo fechahora para almacenar la fecha y la hora de ingreso de una persona a la empresa.

Almacenamos un conjunto de filas en la tabla "asistencia":

insert into asistencia(dni, fechahora) values ('11111111', '2018-09-14 08:00:00');
insert into asistencia(dni, fechahora) values ('22222222', '2018-09-14 06:12:00');
insert into asistencia(dni, fechahora) values ('33333333', '2018-09-14 18:05:00');
insert into asistencia(dni, fechahora) values ('11111111', '2018-09-15 08:02:00');
insert into asistencia(dni, fechahora) values ('22222222', '2018-09-15 06:00:00');
insert into asistencia(dni, fechahora) values ('33333333', '2018-12-15 14:00:00'); 

Imprimir las fechas de ingreso de los empleados con el formato día/mes/año:

select dni, strftime('%d/%m/%Y',fechahora) from asistencia;

Tenemos ahora la recuperación de la fecha con el formato deseado:

SQLite strftime

La función strftime tiene dos parámetros, el primero indica el formato y el segundo es el campo de la tabla a ser afectado por dicho formato.

Utilizamos el caracter % y seguidamente los valores posibles más utilizados son:

  • %d día del mes
  • %m número del mes
  • %Y número de año en formato de 4 dígitos
  • %H Hora del día en formato 00-24
  • %M Minuto en formato de 00-59
  • %S segundos en formato de 00-59

Otros valores posibles:

  • %j día del año en formato 001-366
  • %J número de día en fecha juliana
  • %s cantidad de segundos desde la fecha 01/01/1970
  • %w día de la semana con valores de 0-6 (0=domingo)
  • %W semana del año con un formato de 00-53
  • %f segundos fraccionarios con el formato SS.SSS
  • %% para disponer un % en la cadena de salida

Continuando con el problema vamos a imprimir la la hora de ingreso de cada empleado utilizando el formato "horas:minutos":

select dni, strftime('%H:%M',fechahora) from asistencia;

Imprimir el nombre de mes de cada fecha:

select dni, 
       case strftime('%m',fechahora)
         when '01' then 'enero'
         when '02' then 'febrero'
         when '03' then 'marzo'
         when '04' then 'abril'
         when '05' then 'mayo'
         when '06' then 'junio'
         when '07' then 'julio'
         when '08' then 'agosto'
         when '09' then 'septiembre'
         when '10' then 'octubre'
         when '11' then 'noviembre'
         when '12' then 'diciembre'
       end as mes
  from asistencia;

Utilizamos la estructura case para analizar el valor generado por la función strftime. El resultado de ejecutar la consulta es:

SQLite strftime

Equivalencias entre las funciones

Función                 Equivale a strftime()

date(...)               strftime('%Y-%m-%d', ...)
time(...)               strftime('%H:%M:%S', ...)
datetime(...)           strftime('%Y-%m-%d %H:%M:%S', ...)
julianday(...)          strftime('%J', ...)

Es más eficiente utilizar la función 'date' en lugar de strftime('%Y-%m-%d', ...), pero cuando tenemos que obtener un formato particular no nos queda otra opción que utilizar 'strftime'.

Problema propuesto

  1. Si mediante la sintaxis:

    select date('now');
    

    nos muestra la fecha actual con el formato año-mes-día, hacer los cambios necesarios para que el formato de salida sea:

    Hoy es 5 de octubre de 2018
    
  2. Si mediante la sintaxis:

    select time('now','localtime');
    

    nos muestra la hora local actual con el formato horas:minutos:segundos, hacer los cambios necesarios para que el formato de salida sea:

    05 horas 12 minutos
    
  3. Imprimir el día de la semana de la fecha actual.

Solución
select 'Hoy es ' ||
       strftime('%d',date('now')) ||
       ' de ' ||
       case strftime('%m',date('now'))
         when '01' then 'enero'
         when '02' then 'febrero'
         when '03' then 'marzo'
         when '04' then 'abril'
         when '05' then 'mayo'
         when '06' then 'junio'
         when '07' then 'julio'
         when '08' then 'agosto'
         when '09' then 'septiembre'
         when '10' then 'octubre'
         when '11' then 'noviembre'
         when '12' then 'diciembre'
       end ||
       ' de ' ||
       strftime('%Y',date('now')) as fecha;



select strftime('%H horas %M minutos',time('now','localtime'));



select case strftime('%w',datetime('now'))
         when '0' then 'domingo'
         when '1' then 'lunes'
         when '2' then 'martes'
         when '3' then 'miercoles'
         when '4' then 'jueves'
	 when '5' then 'viernes'
	 when '6' then 'sabado'
       end as diasemana;