Ich erstelle Android-Apps und muss Datum und Uhrzeit des Erstellungsdatensatzes speichern. In den SQLite-Dokumenten heißt es jedoch: "In SQLite ist keine Speicherklasse zum Speichern von Datums- und / oder Uhrzeitangaben reserviert" und "Datums- und Uhrzeitangaben können als TEXT-, REAL- oder INTEGER-Werte gespeichert werden".
Gibt es einen technischen Grund, einen Typ einem anderen vorzuziehen? Und kann eine einzelne Spalte Daten in einem der drei Formate von Zeile zu Zeile speichern?
Ich muss die Daten später vergleichen. In meinen Apps werden beispielsweise alle Datensätze angezeigt, die zwischen Datum A und Datum B erstellt wurden. Ich befürchte, dass das Fehlen einer echten DATETIME-Spalte Vergleiche erschweren könnte.
Antworten:
SQlite hat keinen bestimmten Datum / Uhrzeit-Typ. Sie können verwenden
TEXT
,REAL
oderINTEGER
Arten, je nachdem , was Ihren Bedürfnissen entspricht.Direkt aus dem DOCS
Die in SQLite integrierten Datums- und Uhrzeitfunktionen finden Sie hier .
quelle
Trotzdem würde ich INTEGER verwenden und Sekunden seit der Unix-Epoche (1970-01-01 00:00:00 UTC) speichern.
quelle
RSQLite
scheint sich in einePOSIXct
numerische Epoche umzuwandeln , also funktioniert es gut genug für mich.Eine der leistungsstarken Funktionen von SQLite ist die Auswahl des Speichertyps. Vor- / Nachteile jeder der drei verschiedenen Möglichkeiten:
ISO8601-Zeichenfolge
Reelle Zahl
Ganzzahl
Wenn Sie verschiedene Typen vergleichen oder in eine externe Anwendung exportieren müssen, können Sie bei Bedarf die SQLite- eigenen Konvertierungsfunktionen für Datum und Uhrzeit verwenden .
quelle
localtime_r()
( sqlite.org/lang_datefunc.html#caveats_and_bugs ) in der Referenzimplementierung zu verwenden, undlocaltime()
kann möglicherweise für 2038 anfällig sein, wenn die Hostplattform über 32-Bit verfügttime_t
. Da SQLite behauptet, sich vor dieser Möglichkeit zu schützen, indem externe Daten einer Vorkonvertierung für einen sicheren Bereich zugeordnet werden (siehe denselben Link), ist es meines Erachtens unwahrscheinlich, dass dies ein Problem darstellt, außer vielleicht in esoterischen Fällen.Für praktisch alle Datums- und Zeitangelegenheiten ziehe ich es vor, Dinge zu vereinfachen, sehr, sehr einfach ... Bis auf Sekunden, die in ganzen Zahlen gespeichert sind.
Ganzzahlen werden in Datenbanken, Einfachdateien usw. immer als Ganzzahlen unterstützt. Sie rechnen ein wenig und wandeln sie in einen anderen Typ um. Sie können das Datum beliebig formatieren.
Auf diese Weise müssen Sie sich keine Sorgen machen, wenn [aktuelle Lieblingsdatenbank hier einfügen] durch [zukünftige Lieblingsdatenbank] ersetzt wird, die zufällig nicht das heute gewählte Datumsformat verwendet hat.
Es ist nur ein kleiner Rechenaufwand (z. B. Methoden - dauert zwei Sekunden, ich werde bei Bedarf eine Zusammenfassung veröffentlichen) und vereinfacht die Dinge für viele Operationen in Bezug auf Datum / Uhrzeit später.
quelle
Speichern Sie es in einem Feld vom Typ
long
. SieheDate.getTime()
undnew Date(long)
quelle