2011-03-26 15 views
6

Sto lavorando in SQLite quindi sto memorizzando le date come solo testo.Le date memorizzate come stringa/testo possono essere confrontate direttamente?

YYYY-MM-DD hh:mm:ss

Per quanto posso determinare, dovrei essere in grado di ordinare loro o confrontare con l'altro così come non sono preoccupanti sulle funzioni di data, poiché qualsiasi incrementazione inizia proprio e si sposta a sinistra, proprio come i numeri e tutti i valori sono numerici e i caratteri non numerici sono sempre standardizzati e utilizzo 24 ore al giorno.

Continuo a vedere le persone online che menzionano come le date come testo devono essere convertite per qualsiasi confronto, ma non vedo perché non funzionerebbero così tanto - è purché siano nel più grande -> il più piccolo ordine. Ovviamente non posso fare matematica, ma il Select DateTime From Table where DateTime > 2010-04-21 15:34:55 dovrebbe essere totalmente affidabile, giusto?

C'è qualche eccezione a cui non sto pensando?

risposta

3

La ragione per cui si vedono molte menzioni di conversione quando si memorizzano le date in un database, è che la maggior parte dei motori di database ha un tipo di dati "nativo" per data/ora. SQLite no. Ti suggerisce di memorizzare le date come stringa o come valori in virgola mobile della data julian.

Inoltre, alcuni altri database hanno funzioni di data-a-stringa piuttosto oscure (ti sto guardando, SQL Server), dove è difficile capire come ottenere una stringa di data ordinabile. Il formato data predefinito di SQLite (AAAA-MM-GG HH: NN: SS) è perfettamente ordinabile e facile da leggere.

Se si confrontano o si fascicolano, con le date del testo si fa bene, purché si utilizzi il formato corretto, come si presenta.

Infatti, si può persino fare matematica, usando il codice date and time functions di SQLite; sono piuttosto poco ortodossi ma sorprendentemente flessibili.

+0

ok bene! Non riuscivo a vedere alcun motivo per cui non avrebbe funzionato in quel modo ... – Damon

5

Questo funziona bene. SQLite non ha un tipo di dati DATE (o DATETIME) effettivo come fanno molti altri database. Le opzioni sono per memorizzare la data in un formato stringa che verrà ordinata correttamente (AAAA-MM-GG o AAAA-MM-GG hh: mm: ss) o per convertire la data in un numero e memorizzarla.

Se si utilizza il formato di stringa, quindi è necessario includere virgolette naturalmente:

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

Super, quel trucco di mettere una stringa in virgolette mi ha salvato la giornata. Sono stato alla ricerca di una soluzione .. grazie – Saqib

1

Essi possono essere confrontati come testo fino a quando i valori reali sono ciò che ci si aspetta che siano. Questo è il problema.

Confrontare le date come testo è come correre con le forbici. Ma SQLite ti fa correre con le forbici tutto il tempo.

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 che sia conforme agli standard SQL genererà un "out of range" quando si tenta di inserire o aggiornare i valori come '2011-31-31 08:63:00'. Ma SQLite ti consente di inserire qualsiasi cosa. È anche possibile inserire "Catcall" in una colonna datetime. (Provalo.)

SQLite ti dà lo stesso comportamento "in esecuzione con le forbici" se usi il testo.

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 

Se i valori non sono quello che si aspetta che siano, è molto probabile che vedere il seguente tipo di comportamento.

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

Per essere onesti, 'Catcall' non viene mai inserito in una colonna 'datetime' in SQLite; piuttosto, la colonna sarà una colonna di testo. E fintanto che stiamo usando le forbici, puoi inserire tutto il testo che desideri in una colonna varchar (25) dato che SQLite non aderirà al limite di 25 caratteri definito. –

1

Se tutto quello che stai facendo è la fascicolazione e la ricerca, si dovrebbe andare bene. Le persone hanno utilizzato questo formato per anni con nomi di file esattamente per questo scopo. Dovrebbe solo cominciare a guastarsi se devi fare cose che implicano calcoli (come trovare tutti i record entro trenta giorni da una data specifica).

Problemi correlati