62 - Administración de fechas y horas en SQLite

SQLite no provee un tipo de dato especial para almacenar fechas y horas, por lo que debemos utilizar alguno de los tipos existentes.

Almacenamiento en un campo de tipo text

Podemos definir un tipo de dato 'text' y respetar el formato ISO 8601, éste estándar define el siguiente formato para almacenar la fecha y hora:

YYYY-MM-DD HH:MM:SS

Debemos respetar el orden:

  • YYYY = 4 dígitos para el año.
  • MM = 2 dígitos para el mes (01=enero, etc.)
  • DD = 2 dígitos para el día del mes (01 a 31)
  • Un espacio para separar la fecha de la hora.
  • hh = 2 dígitos para la hora (00 a 23)
  • mm = 2 dígitos para los minutos (00 a 59)
  • ss = 2 dígitos para los segundos (00 a 59)

Problema resuelto 1

Trabajamos con la tabla empleados. Si existe la eliminamos:

drop table if exists empleados;

Creamos la tabla con la siguiente estructura:

create table empleados(
	legajo integer primary key,
	nombre text,
	fechaingreso text
);

Definimos el campo fechaingreso para almacenar cuando el empleado se incorporó a la empresa.

Almacenamos 3 filas en la tabla "empleados":

insert into empleados(nombre, fechaingreso) values ('Rodriguez Pablo', '2000-01-01'); 
insert into empleados(nombre, fechaingreso) values ('Martinez Ana', '1978-12-23'); 
insert into empleados(nombre, fechaingreso) values ('Lopez Oscar', '2017-08-29'); 

Es importante respetar el formato definido por el estándar ISO 8601 para luego operar las fechas almacenadas.

Imprimimos los datos de todos los empleados de la empresa ordenados por la fecha de ingreso a la empresa:

select * from empleados order by fechaingreso;

SQLite fechas y horas

Imprimimos ahora nuevamente los empleados pero ordenados desde las fechas de ingreso más actuales:

select * from empleados order by fechaingreso desc;

Imprimimos todos los empleados que ingresaron a la empresa después del 1 de enero de 2000:

select * from empleados where fechaingreso>='2000-01-01' order by fechaingreso;

Como vemos podemos almacenar solo la fecha en un campo.

Problema resuelto 2

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-09-15 14:00:00'); 

Es importante respetar el orden de los datos de la fecha y hora.

Imprimimos todas las filas de la tabla "asistencia" ordenadas por el campo 'fechahora':

select * from asistencia order by fechahora;

Recuperar solo la fecha del campo 'fechahora':

select dni, date(fechahora) from asistencia;

Para recuperar solo la fecha empleamos la función date.

Recuperar solo la hora del campo 'fechahora':

select dni, time(fechahora) from asistencia;

Para recuperar solo la hora empleamos la función time.

Imprimir los empleados que ingresaron a la empresa entre las 00:00:00 y las 12:00:00:

select * from asistencia where time(fechahora)>='00:00:00' and time(fechahora)<='12:00:00';

Obtenemos el mismo resultado utilizando el operador between:

select * from asistencia where time(fechahora) between '00:00:00' and '12:00:00';

Si queremos las asistencias en el mismo rango de horarios pero ordenadas de menor a mayor:

select * from asistencia where time(fechahora) between '00:00:00' and '12:00:00' order by time(fechahora);

Almacenar la fecha y hora en un campo.

Podemos emplear la función 'date' y pasar la cadena 'now' para obtener la fecha actual del sistema:

insert into empleados(nombre, fechaingreso) values ('Berrotaran mario', date('now')); 

Se almacena en el campo 'fechaingreso' la fecha actual del sistema.

Si necesitamos almacenar la fecha y hora actual utilizamos la función datetime:

insert into asistencia(dni, fechahora) values ('11111111', datetime('now','localtime'));

Se almacena en el campo fechahora la fecha y hora local del equipo donde se ejecuta el programa.

Si necesitamos almacenar la hora UTC (tiempo universal coordinado) llamamos la función datetime solo con el primer parámetro:

insert into asistencia(dni, fechahora) values ('11111111', datetime('now'));