6

Dies ist sehr ähnlich zu another question, die als keine echte Frage geschlossen wurde. Ich habe versucht, es zu bearbeiten, um es für die Wiedereröffnung gültig zu machen, aber es wurde mir gesagt, dass es besser wäre, eine neue Frage zu stellen.So speichern Sie Datetime in SQLite

Ich entwickle auf Android und muss datetime Werte in einer SQLite-Datenbank speichern, um wiederkehrende Ereignisse zu verfolgen, die Benachrichtigungen erzeugen. Ich muss auch in der Lage sein, die Datenbank basierend auf Zeitbereichen abzufragen.

Die SQLite documentation besagt, dass es keine besonderen Datumstypen unterstützt aber Termine können mit Text, REAL oder INTEGER-Typen dargestellt werden:

TEXT als ISO8601 Zeichenketten ("YYYY-MM-DD HH: MM : SS.SSS ").

REAL wie Julian Tag Zahlen, die Anzahl der Tage seit Mittag in Greenwich am 24. November, 4714 B.C. nach dem proleptischen Gregorianischen Kalender.

INTEGER als Unix-Zeit, die Anzahl der Sekunden seit 1970-01-01 00:00:00 UTC.

Die Vorteile jedem zunächst scheinen zu sein:

  • TEXT mit der Fähigkeit, in der Datenbank zur besseren Lesbarkeit nützlich direkt später angezeigt werden (keine Transformation erforderlich), aber teuer, wenn Berechnungen ausgeführt werden müssen Sie. Führt möglichen Fehler aus Zeitzonen ein.
  • REAL nützlich für Daten vor 1970, gut für Berechnungen oder Datumsvergleiche. Stellt keine Uhrzeit, nur Tage dar.
  • INTEGER nützlich für Berechnungen oder Datetime-Vergleiche, sehr gute Kompatibilität, da es ein weit verbreiteter Standard ist.

Klingt das richtig? Würde die Verwendung eines INTEGERS für Datumsangaben die Abfrage von Zeitbereichen merklich beschleunigen, als wenn TEXT verwendet würde? Sonst habe ich noch nicht darüber nachgedacht?

In Anbetracht meines Anwendungsfalls, welche dieser Lösungen wäre am besten?

+1

Welche Art von Daten erwarten Sie (Hunderte, Tausende, Millionen von Datensätzen)? SQLite soll eine kleine db sein, und so ist alles über ein paar hundert Datensätze übertrieben. Ich würde vorschlagen, dass Sie Text verwenden, um Datumswerte zu speichern. Nur wenn Sie eine Notwendigkeit dafür sehen (Sie müssen die Datetime auf Tausenden von Datensätzen berechnen), dann ändern Sie die zugrunde liegenden Daten der Datetime zu einem Real oder Int. –

+0

Höchstens die Anzahl der Datensätze wäre in den unteren Hunderten. Ich denke, das bedeutet, dass Leistung kein Problem ist, aber Text scheint Vergleiche zu erschweren, und ich mache mir Sorgen über den Fehler, den die Sommerzeit einbringen könnte. – Matthew

Antwort

4

TEXT nützlich für die Ablesbarkeit in der Datenbank mit der Möglichkeit, direkt später angezeigt werden (keine Transformation erforderlich)

Das ISO-Format in der Regel nicht für die Anzeige verwendet wird; Das musst du auch transformieren. (Dieses Format für das Debuggen mehr nützlich ist.)

teuer, wenn Berechnungen auf sie ausgeführt werden müssen

Mit Datenbanken, ist der Engpass in der Regel das I/O. Ich bezweifle, dass Sie jemals eine Abfrage sehen, wo das tatsächliche Format der Datumswerte einen spürbaren Unterschied machen würde.

Führt möglichen Fehler von Zeitzonen ein.

Das TEXT-Format verfügt nicht über einen Zeitzonenspezifizierer, aber auch nicht über die anderen Formate. Wenn Sie sagen, dass alle Ihre DB-Werte in UTC sind, gibt es keinen Unterschied.

REAL nützlich für die Daten vor 1970

Alle Formate alle Jahre zwischen 0 unterstützen und 9999. (ganzer Zahlen kann negativ sein.)

Nicht Tageszeit darstellen, nur wenige Tage .

Uhrzeit wird als Bruchwert dargestellt.

INTEGER ... sehr gute Kompatibilität, da es ein weithin unterstützter Standard ist.

Aber Java verwendet Millisekunden, nicht Sekunden.

Alles andere habe ich nicht berücksichtigt?

Das Standardausgabeformat der meisten built-in date functions ist TEXT.


meinen Anwendungsfall gegeben wären, welche diese Lösungen am besten?

Ich würde TEXT sagen, aber ich denke nicht, dass es einen großen Unterschied geben würde.

0

Nicht die Uhrzeit, sondern nur die Tage.

Das ist, was der Bruchteil der ist.

Würde die Verwendung eines INTEGERS für Datumsangaben die Abfrage von Zeitbereichen merklich beschleunigen, als wenn TEXT verwendet wird?

Am wahrscheinlichsten. Ich kann mir kein Szenario vorstellen, in dem Zeichenfolgenvergleiche schneller sind als Ganzzahlvergleiche, insbesondere für indizierte Spalten in Abfragen.

Alles andere habe ich nicht berücksichtigt?

Ich habe keine Ahnung, ob Sie the effects of gamma rays on man-in-the-moon marigolds in Betracht gezogen haben, aber das ist hier nicht wichtig.:-)

In Anbetracht meines Anwendungsfalls, welche dieser Lösungen wäre am besten?

INTEGER, IMHO.

1

Antworten hier werden in erster Linie Meinung sein, aber wenn ich Sie wäre, würde ich den Typ INTEGER verwenden und den Unix-Zeitstempel speichern. Es scheint weniger abhängig von Formatkonvertierungen/-parsing zu sein und ist der allgemeinste unterstützte Standard.

0

Speichern Sie UTC-Datum Zeit als acht Byte 64-Bit-Integer in SQLite. Millis sence 1970.

long time= System.currentTimeMillis(); 

Mit einer indizierten Datenbank finden Sie ausgezeichnete Antwort haben etwa 10k Reihen auf, um von und zwischen Datetime Lesen von Daten.

Belassen Sie die Zeitzonenmanipulationen auf der Ansichtsebene, da eine Datenbank mit allen UTC-Zeiten weltweit funktioniert.

Speichern Sie keine Daten als Text, der so alt ist und keinen Platz in einer modernen Anwendung hat.

Ich würde vermeiden, nur die Daten zu speichern, weil moderne Apps berücksichtigen, wenn ein Ereignis aufgetreten ist. Sie können Datumsangaben mit 8 Bytes speichern. Aber wenn Sie müssen, können Sie einfach das ISO-Datum in eine Ganzzahl von 1999-12-31 wie 19991231 setzen und eine 4-Byte-Ganzzahl in sqllite speichern.

Verwandte Themen