Datetime vs Timestamp in MySQL und PHP in der Praxis?

24

Ich bin mir nicht sicher, wie ich meinen Datentyp als Datum / Uhrzeit oder Zeitstempel angeben soll. Ich denke, ich brauche beide, aber für die verschiedenen Ereignisse. Meine Website verkauft Produkte und Dienstleistungen weltweit und verfügt auch über ein Kontosystem, über das sich Benutzer anmelden können. Bitte klären Sie Folgendes:

  • Aktuelles Datum und Uhrzeit, zu der der Kunde Produkte von meiner Website kauft: Datum / Uhrzeit?
  • Lieferdatum und -zeit basierend auf dem Ort und dem Datum / der Uhrzeit des Kaufs, berechnet von unserem System: Datum / Uhrzeit?
  • Letztes Mal, als sie sich in ihrem Konto angemeldet haben: Timestamp?

    1. Wie lautet der Code in PHP, um das Kaufdatum (aktuelles Datum) zu speichern und dann in der Datenbank zu speichern?
    2. Bitte erläutern Sie deren Verwendung, da ich nach dem Lesen vieler Erklärungen im Internet immer noch nicht alles richtig verstanden habe.
Modular
quelle
Vor einiger Zeit hatte ich ein großes Projekt, bei dem Leistung ein absolutes Muss war. Nach monatelanger Recherche wurde ein UTC-Zeitstempel in einem varchar-Feld gespeichert, der sich als schneller und besser für unsere Bedürfnisse erwies (großes soziales Netzwerk)
JasonDavis

Antworten:

29

MySQL- Zeitstempel :

  • Sind in UTC gespeichert

    Sie werden beim Speichern in UTC konvertiert und beim Abrufen wieder in Ihre Zeitzone konvertiert. Wenn Sie die Zeitzoneneinstellungen ändern , ändern sich auch die abgerufenen Werte.

  • Kann automatisch initialisiert und aktualisiert werden

    Sie können den Standardwert und / oder den Wert für die automatische Aktualisierung auf festlegen CURRENT_TIMESTAMP

  • Haben Sie eine Reihe von 1970-01-01 00:00:01 UTCzu2038-01-19 03:14:07 UTC

Während MySQL datetime :

  • Was Sie aufbewahren, ist das, was Sie bekommen.

  • Haben Sie eine Reihe von 1000-01-01 00:00:00zu9999-12-31 23:59:59

    Werte außerhalb des Bereichs funktionieren möglicherweise - aber nur Werte innerhalb des Bereichs funktionieren garantiert .

  • Sie können Daten speichern, bei denen Tag oder Monat Null sind.

    Dies ist die MySQL-Methode zum Speichern von Geburtstagen! Sie können das nicht mit a machen TIMESTAMP, mit der einzigen Ausnahme, dass der Wert Null von 0000-00-00.

  • Sie können ungültige Daten im ALLOW_INVALID_DATES- Modus speichern, wenn Sie sie benötigen .

  • NOW()In einigen Fällen können Sie den Standardwert auf festlegen. Die bevorzugte und natürlichere Methode zum automatischen Initialisieren und Aktualisieren von Daten ist jedoch TIMESTAMP.

Und natürlich gibt es auch DATEund TIME, die genau so funktionieren DATETIME, aber natürlich DATEkümmert es sich nicht um die Zeit und TIMEnicht um das Datum. Alle vier Datentypen funktionieren perfekt mit den zahlreichen Datums- und Uhrzeitfunktionen . Wenn Sie jedoch Datentypen mischen, sollten Sie die Konvertierungseffekte berücksichtigen .

Nun zu Ihrer Frage: Sie sollten DATETIMEüberall verwenden. Nicht aus technischen Gründen, aber da Sie immer noch nicht wissen, wie MySQL funktioniert, DATETIMEist die einfachere Wahl. Dies bedeutet, dass Sie vor dem Speichern den aktuellen Zeitstempel in PHP berechnen müssen. Dies ist so einfach wie:

$mysqldate = date("Y-m-d H:i:s"); 

Die Datumsfunktion von PHP funktioniert wie folgt:

string date ( string $format [, int $timestamp = time() ] )

Das "Y-m-d H:i:s"Format ist das ein kompatibel mit MySQL und der zweite Parameter leer verlassen, date()ruft time()den Strom zu bekommen UNIX - Zeitstempel .

Die Verwendung von a TIMESTAMPanstelle von a DATETIMEhat den Mehrwert, dass MySQL die Entscheidung über den aktuellen Zeitstempel übernimmt, und Sie können das Feld beim Einfügen / Aktualisieren überspringen. Da Sie jedoch bereits eine Abfrage senden und der Code zum Abrufen des aktuellen Zeitstempels in PHP minimal ist, können Sie mit Sicherheit DATETIMEalles erledigen.

Bezüglich des tatsächlichen Codes zum Speichern des PHP-Zeitstempels in der Datenbank sollten Sie sich PHP Data Objects ansehen. Wenn Sie immer noch unklar sind, fragen Sie stattdessen nach StackOverflow . Es gibt jedoch bereits fast 1,5.000 Fragen. Überprüfen Sie diese, bevor Sie sie stellen. Nur ein Hinweis, vorbereitete Aussagen sind, wie die coolen Kids es machen.

yannis
quelle
Hmm, das könnte ein Problem beim Senden der Abfrage an MySQL oder in Ihrer Tabellenstruktur sein ... StackOverflow ist ein besserer Ort für diese Art von Problemen. Stellen Sie dort eine Frage mit Ihrer Tabellenstruktur und Ihrem vollständigen PHP-Code Einige Details, was das Problem ist und was Sie bereits ausprobiert haben. Wir diskutieren hier nicht wirklich die Implementierungsspezifikationen ...
yannis
Danke für deine Antwort. Ich habe versucht, $ mysqldate = date ("Ymd H: i: s") zu verwenden. $ query = INSERT INTO table VALUE ('". $ mysqldate."') auf meinem PHP-Code, aber es würde in MySQL als 0000-00-00 00:00:00 in Date (Feld) - Datetime (Datentyp) beibehalten. Ich möchte das aktuelle Datum und die aktuelle Uhrzeit speichern. Wenn ich den Datentyp als Zeitstempel in der Datenbank einstelle, wie codiere ich in PHP?
Modular
Momentan darf ich keinen Kommentar zu Stackoverflow abgeben. Klingt ein bisschen schade, aber so haben sie es mir angetan.
Modular
Das tut mir leid, aber wenn Sie sich im temporären Suspendierungsmodus befinden, muss es einen guten Grund geben. Ein möglicher Fehler im Code Ihres Kommentars ist, dass Sie das Feld so benennen Date, dass es ein reserviertes Wort für den DATEDatentyp ist, und dass seltsame Dinge passieren können (abhängig von der MySQL-Version). Versuchen Sie also, es in so etwas umzubenennen creationdateund sehen Sie, was passiert . Außerdem sollten Sie in PHP TIMESTAMPFelder genauso behandeln wie DATETIMEFelder, das spielt eigentlich keine Rolle. Ihr Format ist das gleiche.
Yannis
Tausend Dank. Es ist jetzt sortiert worden, nachdem es fast die ganze Nacht damit verbracht hat, herauszufinden, warum. :)
Modular
2

Referenz aus diesem Artikel entnommen:

Die Hauptunterschiede:

TIMESTAMP wird verwendet, um Änderungen an Datensätzen zu verfolgen und jedes Mal zu aktualisieren, wenn der Datensatz geändert wird. DATETIME dient zum Speichern von spezifischen und statischen Werten, die von Änderungen in Datensätzen nicht betroffen sind.

TIMESTAMP ist auch von verschiedenen TIME ZONE-Einstellungen betroffen. DATETIME ist konstant.

TIMESTAMP konvertierte die aktuelle Zeitzone intern in UTC, um sie zu speichern, und konvertierte sie während des Abrufs zurück in die aktuelle Zeitzone. DATETIME kann das nicht.

Von TIMESTAMP unterstützter Bereich: '1970-01-01 00:00:01' UTC bis '2038-01-19 03:14:07' UTC DATETIME unterstützter Bereich: '1000-01-01 00:00:00' bis '9999 -12-31 23:59:59 ′

Anvesh
quelle
1
Was würden Sie im Jahr 2040 für Änderungen an Datensätzen verwenden, Timestamp? Ich denke nicht.
Bsienn
-1

Nun, ich sehe das auf sehr einfache Weise. In Ihrem Fall würde ich beide datetimeund verwenden timestamp. Wenn Sie beide verwenden, haben Sie keine zusätzlichen Probleme beim Speichern von Daten oder Ähnlichem. Ein zusätzliches Feld (Spalte) in Ihrer Tabelle ist ebenfalls kein großes Problem.

Aus meiner Sicht und aus meinen bisherigen Erfahrungen verwende ich also normalerweise beide. Wenn Sie Ihrem Besucher ein Datum anzeigen oder es für Besucher verständlich machen möchten, zeigen Sie ein Datum im Datums- / Uhrzeitformat an.

Das Datum / Uhrzeit-Format kann problematisch sein, wenn Sie etwas berechnen möchten (Unterschied zwischen 2 Datumsangaben, Abrufen des gestrigen Datums vom aktuellen Datum, Abrufen des aktuellen Datums von 1 Woche vom aktuellen Datum, Abrufen des morgigen Datums oder dergleichen) müssen sie konvertieren timestampund dann das Zeug tun. Und ja aktuelle Datumszeit zum Beispiel bekommen Sie mit: $current = date("Y-m-d");oder $current = date("Y-m-d H:i:s");wenn Sie auch Stunden, Minuten und Sekunden wollen.

Der Zeitstempel ist nur eine elfstellige Zahl, die eigentlich nichts "bedeutet". Wenn Sie es betrachten, wissen Sie nicht, welches Datum es darstellt. Es ist also nicht wirklich benutzerfreundlich und Sie können es nicht verwenden, um es einfach wiederzugeben und es beispielsweise Ihren Besuchern zu zeigen. Sie müssen es in etwas Lesbares "transformieren". Es bietet Ihnen aber auch die Möglichkeit, es einfach umzurechnen und verschiedene Daten zu berechnen. Wenn Sie beispielsweise den Zeitstempel für morgen gleichzeitig abrufen möchten, müssen Sie dem aktuellen Datum nur die Anzahl der Sekunden hinzufügen und haben den Zeitstempel für morgen. Beispiel: $tomorrow = time()+24*3600;Sie können auch leicht einen Unterschied zwischen zwei Daten in Sekunden oder etwas Ähnlichem feststellen.

Daher würde ich vorschlagen, sowohl Datums- als auch Zeitstempel zu verwenden. Selbst wenn Sie beispielsweise PhpMyadmin verwenden und einige Daten schnell anzeigen möchten, ist es für Sie einfacher, wenn Sie ein Datum im Datums- / 2011-12-20 10:15:20Uhrzeitformat (Beispiel :) sehen, wie es der Fall ist, wenn Sie nur die 11-stellige Zahl betrachten. Verwenden Sie also beide und rufen Sie dann an und verwenden Sie diejenige, die besser zu Ihnen passt.

Wenn Sie nur einen auswählen müssen oder möchten, würde ich vorschlagen, dass der Zeitstempel ansonsten beide verwendet.

Kennzeichen
quelle
1
-1 Timestamp is just a number 11 digit long which doesn't really "mean" anythingMySQL-Zeitstempel werden im selben Format wie datetime gespeichert. Sie müssen sie auch in PHP-Zeitstempel konvertieren, um die von Ihnen beschriebenen Berechnungen durchzuführen, ODER einfach die vielen Datums- / Zeitfunktionen von MySQL verwenden und die Berechnungen in der Datenbank durchführen. Deine Antwort macht eigentlich keinen Sinn.
Yannis