2009-12-19 10 views
90

Ich versuche, einen Datetime-Wert in eine SQLite-Datenbank einzufügen. Es scheint zu sein, sucsessful aber wenn ich versuche, den Wert abzurufen, gibt es einen Fehler:Wie füge ich Datetime-Wert in eine SQLite-Datenbank ein?

<Unable to read data>

Die SQL-Anweisungen sind:

create table myTable (name varchar(25), myDate DATETIME) 
insert into myTable (name,mydate) Values ('fred','jan 1 2009 13:22:15') 

Antwort

119

Das Format, das Sie brauchen, ist:

'2007-01-01 10:00:00' 

dh yyyy-MM-dd HH: mm: ss

Wenn möglich, verwenden Sie jedoch eine parametrisierte Abfrage, da Sie damit keine Sorgen mehr haben über die Formatierungsdetails.

+0

Wie geht man um mit solchen Saiten nach dem Datum? –

+3

Wenn Sie Daten wie diese formatieren, funktionieren die Datumsreihenfolge und die lexikalische Reihenfolge gleich. Z.B. '2008-02-01'> '2007-02-01', '2008-01-02'> '2008-01-01' sowohl als Strings als auch als Daten. Sie müssen sich jedoch nicht unbedingt darum kümmern, da SQLite ORDER BY die Bestellung für Sie übernimmt. – itowlson

+5

Beachten Sie, dass Sie Datumsangaben mit unterschiedlicher Genauigkeit nicht mit lexikalischer Reihenfolge vergleichen können, z. B. "SELECT '2007-01-02 10:00:00'> '2007-01-02 10:00';" gibt 1 zurück, aber "SELECT datetime ('2007-01-02 10:00:00')> datetime ('2007-01-02 10:00');" gibt 0 zurück. – Shane

40

Die Art und Weise Daten in SQLite zu speichern ist:

yyyy-mm-dd hh:mm:ss.xxxxxx 

SQLite hat auch einige Datums- und Zeitfunktionen Sie verwenden können. Siehe SQL As Understood By SQLite, Date And Time Functions.

+1

FYI, '.xxxxxx 'hier in @ TorValamos Syntax =' .SSS' =% f in der SQLite-Dokumentation, d. H. Sekundenbruchteile. –

+2

DateTime.parse ('2016-05-28 14:27:00 -0300') .strftime ('% Y-% m-% d% H:% M:% S') – rodvlopes

16

Sie müssen das Format der von Ihnen gelieferten Datumszeichenfolge ändern, um sie mit der STRFTIME-Funktion einfügen zu können. Grund dafür ist, gibt es keine Option für einen Monat Abkürzung:

%d day of month: 00 
%f fractional seconds: SS.SSS 
%H hour: 00-24 
%j day of year: 001-366 
%J Julian day number 
%m month: 01-12 
%M minute: 00-59 
%s seconds since 1970-01-01 
%S seconds: 00-59 
%w day of week 0-6 with sunday==0 
%W week of year: 00-53 
%Y year: 0000-9999 
%% % 

Die Alternative ist das Datum/Zeit in ein bereits akzeptierten Format zu formatieren:

  1. YYYY-MM-DD
  2. JJJJ- MM-DD HH: MM
  3. YYYY-MM-DD HH: MM: SS
  4. YYYY-MM-DD HH: MM: SS.SSS
  5. YYYY-MM-DDTHH: MM
  6. YYYY-MM-DDTHH: MM: SS
  7. YYYY-MM-DDTHH: MM: SS.SSS
  8. HH: MM
  9. HH: MM: SS
  10. HH: MM: SS.SSS
  11. jetzt

Referenz: SQLite Date & Time functions

+0

Obwohl nicht in der Tabelle aufgeführt Dokumente geben auch an, dass Sie 'Z' oder Offsets wie '-0400' hinzufügen können. – CoolAJ86

0

das mag nicht die populärste oder effiziente Methode, aber ich neige stark in Datentypen SQLite sinc verzichten Sie sind alle im Grunde genommen als Strings ausgegeben.

Ich habe einen dünnen C# -Wrapper um die SQLite-Bibliothek geschrieben (natürlich bei Verwendung von SQLite mit C#), um Einfügungen und Extraktionen von und nach SQLite zu behandeln, als ob ich mit DateTime-Objekten arbeiten würde.

+0

Fällt nicht auf Daten, wenn z Du wolltest nach diesem Feld sortieren; Sie enden mit einem String-Vergleich ... – Greg

+2

String Vergleich von Daten funktioniert gut mit YYYY-MM-DD Bestellung. – dan04

5

Gelesen This: 1.2 Date und Zeitdatentyp bester Datentyp zum Speichern von Datum und Uhrzeit ist:

TEXT bestes Format ist: yyyy-MM-dd HH:mm:ss

las Dann this Seite; Dies ist am besten über Datum und Uhrzeit in SQLite zu erklären. Ich hoffe, das hilft Ihnen

+3

Sie sollten in Betracht ziehen, die Frage zu beantworten, mit Links, die Ihre Antwort unterstützen, nicht nur ein paar Links –

5

Verwenden CURRENT_TIMESTAMP wenn Sie es brauchen statt NOW() (die MySQL ist)

+1

das ist funktioniert, eine Sache ist falsch. CURRENT_TIMESTAMP return datetime ohne UTC, wissen Sie, wie Sie dieses Problem lösen können. Vielen Dank im Voraus! –

Verwandte Themen