Würden Sie die Verwendung eines datetime oder eine Zeitstempel Feld und warum (unter Verwendung von MySQL)?
Ich arbeite mit PHP auf der Serverseite.
Würden Sie die Verwendung eines datetime oder eine Zeitstempel Feld und warum (unter Verwendung von MySQL)?
Ich arbeite mit PHP auf der Serverseite.
"Ab MySQL 5.6.4 bleibt die Speicherung für YEAR und DATE unverändert. DATETIME ist jedoch effizienter gepackt und benötigt 5 statt 8 Bytes", also ein Unterschied von 1 Byte zwischen Timestamp und Datetime, wobei Timestamp im Jahr 2038 "ausläuft" :) Aus der Doku: dev.mysql.com/doc/refman/8.0/de/
Ich mag Unix-Zeitstempel, weil man sie in Zahlen umwandeln kann und sich nur um die Zahl kümmern muss. Außerdem kann man addieren/subtrahieren und erhält die Zeitdauer usw. Dann konvertiert man das Ergebnis in ein beliebiges Datumsformat. Dieser Code findet heraus, wie viel Zeit in Minuten zwischen einem Zeitstempel aus einem Dokument und der aktuellen Zeit vergangen ist.
$date = $item['pubdate']; (etc ...)
$unix_now = time();
$result = strtotime($date, $unix_now);
$unix_diff_min = (($unix_now - $result) / 60);
$min = round($unix_diff_min);
A DATETIME
trägt keine Zeitzoneninformationen mit sich und zeigt immer die gleiche Zeitzone an, unabhängig von der Zeitzone, die für die Sitzung gilt, die standardmäßig die Zeitzone des Servers ist, es sei denn, Sie haben sie ausdrücklich geändert. Wenn ich jedoch eine DATETIME
Spalte mit einer Funktion wie NOW()
und nicht eine Wendung wie '2020-01-16 12:15:00'
wird als Wert natürlich das aktuelle Datum und die aktuelle Uhrzeit in der Zeitzone der Sitzung gespeichert.
A TIMESTAMP
enthält dagegen implizit Zeitzoneninformationen: Bei der Initialisierung einer TIMESTAMP
Spalte einen Wert enthält, wird dieser Wert vor der Speicherung in UTC konvertiert. Wenn der zu speichernde Wert ein Literal ist, wie z. B. '2020-01-16 12:15:00'
wird sie für die Umrechnung als in der aktuellen Zeitzone der Sitzung liegend interpretiert. Umgekehrt, wenn eine TIMESTAMP
Spalte angezeigt wird, wird sie zunächst von UTC in die aktuelle Zeitzone der Sitzung umgerechnet.
Wann sollte man das eine oder das andere verwenden? Eine Fallstudie
Eine Website für eine kommunale Theatergruppe präsentiert mehrere Aufführungen eines Stücks, für das sie Karten verkauft. Die Daten und Uhrzeiten dieser Aufführungen werden in einer Dropdown-Liste angezeigt, aus der ein Kunde, der Karten für eine Aufführung kaufen möchte, eine auswählen kann. Es wäre sinnvoll, wenn die Datenbankspalte performance_date_and_time
zu sein DATETIME
Typ. Wenn die Aufführung in New York stattfindet, wird davon ausgegangen, dass es eine implizite Zeitzone gibt ("New Yorker Ortszeit"), und im Idealfall möchten wir, dass das Datum und die Uhrzeit unabhängig von der Zeitzone der Sitzung als "12. Dezember 2019 um 20:00 Uhr" angezeigt werden, ohne dass eine Zeitzonenumrechnung erforderlich ist.
Sobald die Vorstellung am 12. Dezember 2019 um 20.00 Uhr begonnen hat, möchten wir vielleicht keine Karten mehr dafür verkaufen und diese Vorstellung nicht mehr in der Dropdown-Liste anzeigen. Wir würden also gerne wissen, ob die Vorstellung am 12.12.2019 um 20:00:00 Uhr stattgefunden hat oder nicht. Das würde dafür sprechen, dass wir eine TIMESTAMP
Spalte die Zeitzone für die Sitzung auf "America/New_York" mit set session time_zone='America/New_York'
und dann speichern '2019-12-12 20:00:00'
in die TIMESTAMP
Spalte. Von nun an können wir testen, ob die Leistung begonnen hat, indem wir diese Spalte vergleichen mit NOW()
unabhängig von der Zeitzone der aktuellen Sitzung.
Oder es könnte sinnvoll sein, eine DATETIME
und eine TIMESTAMP
Spalte für diese beiden unterschiedlichen Zwecke. Oder auch nicht. Es ist klar, dass eine der beiden Spalten beiden Zwecken dienen kann. Wenn Sie sich nur für eine DATETIME
müssen Sie die aktuelle Zeitzone auf Ihre lokale Zeitzone einstellen, bevor Sie sie mit NOW()
. Wenn Sie nur mit einer TIMESTAMP
Spalte anzuzeigen, müssen Sie die Sitzungszeitzone auf Ihre lokale Zeitzone einstellen, bevor Sie die Spalte anzeigen lassen.
Was für TIMESTAMP-Werte, aber auch für MySQL-Datum/Uhrzeit-Funktionen wichtig ist, ist nicht die Server time_zone
aber die Sitzung time_zone
(die standardmäßig auf den Server time_zone
bis zur ausdrücklichen Änderung). Verlassen Sie sich in Ihrer Anwendung niemals auf einen Standard, der sich ändern könnte.
@dolmen Sie haben natürlich recht, aber wir reden hier über Semantik. Ich sage in meiner Antwort, "... setting the the server's timezone for the session ...".
Vielleicht hätte man es deutlicher ausdrücken können, indem man einfach sagt: "Einstellung der Zeitzone für die Sitzung", aber letztendlich wird dies die Zeitzone sein, die der Server verwendet. Ich werde die Antwort aktualisieren, um dies deutlicher zu machen.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
2 Stimmen
Hier finden Sie einige wichtige Informationen codeproject.com/Tipps/1215635/MySQL-DATETIME-vs-TIMESTAMP
11 Stimmen
Wenn Sie möchten, dass Ihre Anwendung im Februar 2038 unterbrochen wird, verwenden Sie timestamp. Prüfen Sie den Datumsbereich.
0 Stimmen
Wenn auch nur die geringste Möglichkeit besteht, dass Ihre Datenbank Werte in einer anderen Zeitzone speichern oder Verbindungen von einer Anwendung in einer anderen Zeitzone empfangen muss, sollten Sie ISO-8601 CHARs für alle wichtigen Zeitstempel verwenden. Siehe diese Frage: stackoverflow.com/questions/40670532/
0 Stimmen
Datetime ist völlig nutzlos . es ist nur ein dummer String. timestamp ist in jeder Hinsicht perfekt sondern sie endet im Jahr 2038.