64 - Almacenamiento de fechas y horas en campos de tipo integer y real

Vimos en conceptos anteriores que el formato más común para almacenar fechas y horas es utilizar un campo text y guardarlo con un formato:

YYYY-MM-DD HH:MM:SS

Pero en algunas situaciones por razones de eficiencia puede ser más conveniente almacenarlo en un campo de tipo 'integer' o 'real'.

Campo de tipo 'integer'

Podemos almacenar una fecha y hora utilizando el 'Tiempo Unix' que se define como la cantidad de segundos transcurridos desde el 1 de enero de 1970.

Veamos con un ejemplo como podemos administrar un campo donde guardamos una fecha con formato 'integer'.

Borramos la tabla 'tabla1' si ya existe:

drop table if exists tabla1;

Creamos la tabla con un campo de tipo 'integer':

create table tabla1 (
  fechahora integer
);

Insertamos una fila con la fecha y hora con el 'Tiempo Unix':

insert into tabla1(fechahora) values (strftime('%s','now'));

Mostramos la fila insertada:

select fechahora from tabla1;

La salida tiene poco sentido para un humano ya que nos muestra la cantidad de segundos que han pasado desde el 1 de enero de 1970:

SQLite fecha hora integer

Si queremos que se muestre en un formato legible debemos utilizar la función 'datetime':

select datetime(fechahora, 'unixepoch','localtime') from tabla1;

Como resultado ahora tenemos:

SQLite fecha hora integer datetime

Podemos utilizar el valor devuelto por la función datetime para generar un formato particular con la función strftime:

select strftime('%d/%m/%Y %H:%M:%S',datetime(fechahora, 'unixepoch','localtime')) from tabla1;

Como resultado ahora tenemos:

SQLite fecha hora integer datetime strftime

Insertemos otra fecha en la tabla utilizando el formato ISO 8601:

insert into tabla1(fechahora) values (strftime('%s','2000-08-23 14:12:10'));

Mostremos las dos filas de la tabla:

select datetime(fechahora, 'unixepoch','localtime') from tabla1;

Campo de tipo 'real'

Se utiliza la fecha juliana. El día juliano es el número de días y fracción transcurridos desde el mediodía del 1º de enero del año 4713 antes de Cristo.

Veamos como administramos una fecha definiendo un campo de tipo 'real'.

Borramos la tabla 'tabla2' si existe:

drop table if exists tabla2;

Creamos la tabla con la siguiente estructura:

create table tabla2 (
  fechahora real
);

Almacenamos la fecha y hora actual en formato de fecha juliana:

insert into tabla2(fechahora) values (strftime('%J','now'));

Exactamente lo mismo podemos hacer utilizando la función 'julianday':

insert into tabla2(fechahora) values (julianday('now'));

Mostramos el campo 'fechahora' tal cual como está almacenado en tabla:

select fechahora from tabla2;

El valor real almacenado no es entendible para nosotros. Veamos como lo podemos mostrar en un formato legible:

select datetime(fechahora) from tabla2;

Es decir utilizamos la función datetime para transformarlo.