SQLite Datum und Uhrzeit-Datentyp
Ich versuche zu bauen, ein nettes, kleines Datenbank zu führen auf eine mobile Anwendung (Windows Mobile 5, wenn Sie neugierig sind).
In der SQLite-Dokumentation, das Datum und die Uhrzeit-Datentyp wird wie folgt definiert:
1.2 Datum und Uhrzeit Datentyp
SQLite nicht über eine storage-Klasse, die beiseite für die Speicherung von Daten
und/oder times. Stattdessen werden die integrierten Datums-Und Zeit-Funktionen von SQLite
sind in der Lage die Speicherung von Datumsangaben und Uhrzeiten als TEXT, REAL oder INTEGER
Werte:
- TEXT nach ISO8601-strings ("YYYY-MM-DD HH:MM:SS.SSS").
- REAL als Julianische tageszahlen, die Anzahl der Tage seit Mittag in Greenwich am November 24, 4714 B. C. nach der proleptische
Gregorianischen Kalender.- INTEGER als Unix-Zeit die Anzahl der Sekunden seit 1970-01-01 00:00:00 UTC.
Anwendungen wählen können, zum speichern von Datums-und Zeitangaben in diesen
Formate und frei konvertieren zwischen den Formaten mithilfe der integrierten Datums-und
Zeit-Funktionen.
So, was meiner DateTime
Wert, als entweder eine REAL
(float) oder INTEGER
ist die gleiche Größe.
Was über die TEXT
format? Es gibt 23 Zeichen oben im text YYYY-MM-DD HH:MM:SS.SSS
. Ist, dass 8 Byte pro Zeichen? Wenn ja, ist das ein RIESIGE Verschwendung von Speicherplatz zum speichern in Text-format (das ist das, was ich Tue zurzeit).
Was über die REAL
format? Würde ich definieren, eine Basis Datum November 24, 4714 B. C.? (Ich bin auch nicht sicher, ob Visual Studio 2008 wird mich das tun lassen. Ich habe nie versucht.) Dann Holen Sie sich die TimeSpan
zwischen Basis Datum Datum und ich will, extrahieren Sie die Anzahl der Tage, und speichern Sie das?
//is this how to declare this date?
private static readonly DateTime nov24_4714bc = new DateTime(-4714, 11, 24);
public static double GetRealDate(DateTime dateTime) {
//FYI: subtracting dates in .NET returns a time span object
return (dateTime - nov24_4714bc).TotalDays;
}
Was über die INTEGER
format? Würde ich definieren, eine Basis Datum von 1970-01-01 00:00:00 UTC
(bitte sagen Sie mir, wie zu tun!), dann Holen Sie sich die TimeSpan
zwischen Basis Datum und meinen input Datum, extrahieren Sie die Anzahl der Sekunden ein, und speichern Sie das?
//is this a UTC date?
private static readonly DateTime utc1970_01_01 = new DateTime(1970, 1, 1);
public static double GetIntDate(DateTime dateTime) {
//FYI: subtracting dates in .NET returns a time span object
return (dateTime - nov24_4714bc).TotalSeconds;
}
Hilfe mit dieser? Ich bin ein wenig verwirrt, auf ein paar Punkte.
- pls nicht speichern Daten als text.
- FYI: Die
REAL
Datumsformat Nov 24, 4714 v. Chr. wirft eineArgumentOutOfRangeException
: "das Angegebene argument lag außerhalb des Bereichs Gültiger Werte." - und haben Sie zu vertreten, 4714 v. Chr. ?
- Auch scheint es, wenn ich store in der UTC-Zeit und der Benutzer das Datum ändert aus welchem Grund auch immer, wird die gespeicherte Datums-Zeit-Werte sind schrecklich verkorkst. Die Speicherung von "07/04/1776" für Amerika ist Independence day ist verschwenderisch, aber viel mehr zuverlässig - es sei denn, ich bin fehlt etwas.
- Die
SQLite
doc ich oben verwiesen Staaten, auf die Sie verweisen, von 4714 v. Chr. berechnen Sie den Wert für das Datum.
Du musst angemeldet sein, um einen Kommentar abzugeben.
TEXT
- format, wenn die "menschliche Lesbarkeit" ist wichtig.Wenn Sie nicht brauchen, Millisekunden-Präzision, können Sie Platz sparen, in der
TEXT
- format nur mit dem Teil, den Sie brauchen. Es gibt 3 kürzere Formate akzeptiert SQLite Datum/Zeit-Funktionen:YYYY-MM-DD HH:MM:SS
(19 Zeichen)YYYY-MM-DD HH:MM
(16 Zeichen)YYYY-MM-DD
(10 Zeichen)(NIE verwenden
MM/DD/YYYY
; es ist nicht unterstützt, und Sie werden nicht richtig sortiert.)Können Sie nicht:
System.DateTime
unterstützt nur die Jahre 1-9999. Sie müssen wählen Sie eine andere Basis Datum, und führen Sie dann(dateTime - baseDate).TotalDays + baseDateJD
, wobaseDateJD
ist das Julianische Datum des Basis-Datum. Einige sinnvolle Optionen sind: