web-dev-qa-db-de.com

So speichern Sie UNIX-Zeitstempel mit MySQL

Einige Hintergrund:

Meine Website ist in hohem Maße darauf angewiesen, Benutzer über verschiedene Zeitzonen hinweg zu koordinieren.

Ich verwende Carbon, um meine Zeitzonenumwandlungen und -berechnungen auf der Serverseite und moment.js auf dem Client auszuführen.

Als Ergebnis wurde die Designauswahl getroffen, dass alle Datumszeiten (z. B. die Startzeit eines Ereignisses) als Unix-Zeitstempel gespeichert würden.

Problem

Ich bin etwas verwirrt von der Definition eines "Zeitstempels". In PHPMyAdmin ist der Zeitstempel kein Unix-Zeitstempel, sondern ein Datumsformat:

2016-10-06 20:50:46

Wenn Sie also ein Standardfeld des aktuellen Zeitstempels haben möchten, wird das aktuelle Datum in GMT angezeigt.

Dies macht die Konvertierung in eine Zeitzone eines Benutzers im Vergleich zu einer Unix-Zeitstempel-Ganzzahl schwieriger.

Frage:

Welchen Feldtyp sollte ich als Unix-Zeitstempel speichern, derzeit verwende ich int(11) mit einem Standardwert von none. Durch Erweiterung ... gibt es eine Möglichkeit, den aktuellen Unix-Zeitstempel (z. B. 1475971200) standardmäßig in MySQL zu speichern?

8

Ein Unix-Zeitstempel ist eine große Ganzzahl (die Anzahl von Sekunden seit 1970-01-01 00:00:00 UTC). Daher ist INT(11) der korrekte Datentyp.

Leider glaube ich nicht, dass es eine Möglichkeit gibt, einen Standard festzulegen, durch den der aktuelle Zeitstempel eingefügt wird. Sie müssen UNIX_TIMESTAMP() beim Einfügen explizit aufrufen und verwenden. Funktionsaufrufe sind in DEFAULT-Spezifikationen nicht zulässig.

11
Barmar

Sie können weiterhin ein vorzeichenloses INT verwenden, müssen jedoch den Zeitstempel beim Einfügen manuell festlegen (UNIX_TIMESTAMP()).

Oder Sie können den TIMESTAMP-Typ mit dem Standard-CURRENT_TIMESTAMP (der als int hinter den Kulissen gespeichert wird) verwenden und ihn bei der Auswahl in ein int konvertieren:
SELECT UNIX_TIMESTAMP(foo_field) FROM foo_table

Referenz - Kann in MySQL eine Spalte mit dem Standardwert UNIX_TIMESTAMP erstellt werden?

2
George Kagan

Eigentlich müssen Sie entweder bigint oder varchar verwenden, da das Maximum für int(11) 2'147'483'647 ist (weitere Informationen hier ). 

Dann müssen Sie, wie die vorherigen Antworten sagen, UNIX_TIMESTAMP() manuell einfügen.

0
Luka Govedič

int (10) ist für eine 10-stellige Zahl mit maximal 4294967295 und dem aktuellen Zeitstempel 1553244188 in Ordnung. In Ganzzahlfeldern verwende ich für meine Abfragen die Ganzzahl-Standardeinstellung 0 (nicht festgelegt).

0
Nik Drosakis