2011-03-26 24 views
6

Estoy trabajando en SQLite, así que estoy almacenando fechas como solo texto.¿Se pueden comparar las fechas almacenadas como cadena/texto directamente?

YYYY-MM-DD hh:mm:ss

Por lo que yo puedo determinar, yo debería ser capaz de ordenarlos o compararlas entre sí al igual que no se preocupan por las funciones de fecha, ya que cualquier incrementación comienza a la derecha y se mueve a la izquierda, al igual que los números , y todos los valores son numéricos, y los caracteres no numéricos están siempre estandarizados y estoy usando la hora de 24 horas.

Sigo viendo a personas en línea mencionar cómo deben convertirse las fechas como texto para cualquier comparación, pero no veo por qué no solo funcionarían como -estan si están en el mayor-> menor orden. Obviamente no puedo hacer matemáticas, pero Select DateTime From Table where DateTime > 2010-04-21 15:34:55 debería ser totalmente confiable, ¿verdad?

¿Hay alguna excepción en la que no estoy pensando?

Respuesta

3

La razón por la que está viendo muchas menciones de conversión al almacenar fechas en una base de datos, es que la mayoría de los motores de base de datos tienen un tipo de datos 'nativo' para la fecha/hora. SQLite no. Sugiere que almacene las fechas como cadena o como fecha juliana con valores de coma flotante.

Además, algunas otras bases de datos tienen funciones bastante confusas de fecha a cadena (te estoy mirando, SQL Server), donde es difícil encontrar la manera de obtener una cadena de fecha ordenable. El formato de fecha predeterminado de SQLite (AAAA-MM-DD HH: NN: SS) es perfectamente ordenable y fácil de leer.

Te irá bien con las fechas de los textos cuando comparas o compilaciones, siempre que uses el formato correcto, como el que presentas.

De hecho, incluso puede hacer cálculos matemáticos, mediante el uso de SQLite date and time functions; son poco ortodoxos pero sorprendentemente flexibles.

+0

bien ¡genial! No pude ver ninguna razón por la que no funcionaría así ... – Damon

5

Esto funciona bien. SQLite no tiene un tipo de datos de DATE (o DATETIME) real como lo hacen muchas otras bases de datos. Sus opciones son almacenar la fecha en un formato de cadena que se ordenará correctamente (AAAA-MM-DD o AAAA-MM-DD hh: mm: ss) o para convertir la fecha en un número y almacenarlo en su lugar.

Si se utiliza el formato de cadena, entonces usted tiene que incluir comillas por supuesto:

SELECT DateTime FROM Table WHERE DateTime > '2010-04-21 15:34:55' 
+1

Super, ese truco de poner cadena en comillas simples salvó mi día. He estado buscando una solución ... gracias – Saqib

1

que puedan ser comparados como texto, siempre y cuando los valores reales son lo que se espera que sean. Ese es el problema.

Comparando fechas como texto es como correr con tijeras. Pero SQLite te hace correr con tijeras todo el tiempo.

sqlite> create table test (d1 datetime primary key); 
sqlite> insert into test values ('2011-31-31 08:63:00'); 
sqlite> select * from test; 
2011-31-31 08:63:00 

un DBMS que se ajusta a los estándares SQL elevarán un "fuera de rango" de error cuando intenta insertar o actualizar valores como '2011-31-31 08:63:00'. Pero SQLite te permite insertar cualquier cosa. Incluso puede insertar 'Catcall' en una columna de fecha y hora. (Pruébalo).

SQLite te ofrece el mismo comportamiento de "correr con tijeras" si usas el texto.

sqlite> create table test (d1 varchar(25) primary key); 
sqlite> insert into test values ('2011-31-31 08:63:00'); 
sqlite> select * from test; 
2011-31-31 08:63:00 

Si los valores no son lo que se espera que sean, es muy probable que vea el siguiente tipo de comportamiento.

sqlite> create table test (d1 varchar(25), d2 varchar(25)); 
sqlite> insert into test values ('2011-01-01 08:00:00', '2011-01-01 08:15:00'); 
sqlite> select d1<d2 from test; 
1 
sqlite> update test set d2 = '2011+01-01 08:15:00'; 
sqlite> select d1<d2 from test; 
0 
+0

Para ser justos, 'Catcall' nunca se inserta en una columna 'datetime' en SQLite; más bien, la columna será una columna de Texto. Y mientras ejecutemos con tijeras, puede insertar tanto texto como desee en una columna de varchar (25) ya que SQLite no se adherirá al límite de char de 25 definido. –

1

Si todo lo que hace es recopilar y buscar, debería estar bien. La gente ha estado utilizando este formato durante años con nombres de archivo para exactamente ese propósito. Solo debe comenzar a descomponerse si necesita hacer cosas que impliquen cálculos (como buscar todos los registros dentro de los treinta días de una fecha específica).

Cuestiones relacionadas