lunes, 14 de septiembre de 2009

Uso de fechas en SQLite

Este es mi primer post sobre SQLite, una base de datos muy ligera, pero potente y rápida, y que no necesita apenas administración. Es software libre, por lo que no necesitarás pagar licencias por su uso, y tendrás un importante ahorro de costes. Por otro lado, hay versiones para varias plataformas, incluyendo a Microsoft Windows, Linux, BSD, etc.

En un reciente proyecto personal en el que estoy embarcado, utilizo C#, en donde sólo es necesario una referencia a la librería System.Data.SQLite.dll (se puede descargar de http://sqlite.phxsoftware.com/). En el ordenador final, a la hora de instalarse, no es necesario tener el motor de la base de datos, pues la propia librería actúa como tal, y de una manera muy rápida y eficiente.

Pero SQLite puede utilizarse de muchas maneras, como embebido en C, o desde Java, o desde PHP (sólo por citar las más populares). Además, existen multitud de IDE's para diseñar y gestionar la base de datos, y no sólo una consola de comandos, por lo que no hay excusa para no probar esta base de datos.

Querría haber empezado una serie de posts sobre SQLite desde el principio (cosa que haré más adelante), pero por tiempo empezaré directamente con algo que puede despistarnos con respecto a otras bases de datos, y son el uso de fechas.

Un campo fecha se define como:

CREATE TABLE (nombre_campo DATE ...);

Aunque permite insertar o modificar los datos en el formato 'dd/mm/yyyy' es recomendable almacenar las fechas en el formato ordenable, del estilo '2004-06-26T20:11:04' (en .NET se realiza mediante String.Format("{0:s}", valor_datetime). Aunque este formato es válido, a la hora de comparar fechas tendrá en cuenta también la hora, por lo que si la precisión que se desea es sobre el día, y no sobre día y hora, el formato recomendado sería 'yyyy-mm-dd', que en .NET se obtendría mediante String.Format("{0:yyyy'-'MM'-'dd}", valor_datetime).

La razón de de este formato es que SQLite, internamente, la fecha se almacena como una cadena de texto.

Pero a la hora de hacer una búsqueda por fechas, del estilo:

SELECT ...
FROM ...
WHERE fecha1>fecha2

nos llevaremos una sorpresa al comprobar que no nos hace mucho caso.

A la hora de comparar fechas, hay que utilizar el formato juliano, y ello se consigue mediante una función especial de SQLite.

SELECT ...
FROM ...
WHERE julianday(fecha1)>julianday(fecha2)

De esta manera la comparación de fechas funcionará sin problemas.

Safe Creative #1001195348570