3170 Stimmen

Sollte ich in MySQL den Datentyp datetime oder timestamp verwenden?

Würden Sie die Verwendung eines datetime oder eine Zeitstempel Feld und warum (unter Verwendung von MySQL)?

Ich arbeite mit PHP auf der Serverseite.

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/

7voto

Mwangi Thiga Punkte 1309

A TIMESTAMP benötigt 4 Bytes, während ein DATETIME benötigt 8 Bytes.

2 Stimmen

"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/

6voto

Mahdi Jazini Punkte 773

TIMESTAMP ist nützlich, wenn Sie Besucher aus verschiedenen Ländern mit unterschiedlichen Zeitzonen haben. Sie können den TIMESTAMP einfach in eine beliebige Zeitzone konvertieren.

6voto

user723220 Punkte 787

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);

4 Stimmen

Oder verwenden Sie eine von Menschen lesbare und native MySQL-Datetime und verwenden Sie native MySQL-Funktionen zum Addieren/Subtrahieren von Datumsangaben.

5voto

Booboo Punkte 28105

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.

0 Stimmen

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.

0 Stimmen

@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.

4voto

Martin Zeitler Punkte 1

Ich verwende lediglich unsigned BIGINT beim Speichern von UTC ...

die dann in PHP noch an die Ortszeit angepasst werden kann.

die DATETIME ausgewählt werden mit FROM_UNIXTIME( integer_timestamp_column ) .

sollte man natürlich einen Index auf diese Spalte setzen, sonst gäbe es keinen Fortschritt.

CodeJaeger.com

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.

Powered by:

X