Würden Sie empfehlen, ein Datum / Uhrzeit- oder ein Zeitstempelfeld zu verwenden, und warum (mit MySQL)?
Ich arbeite mit PHP auf der Serverseite.
mysql
datetime
timestamp
sqldatatypes
Karlipoppins
quelle
quelle
Antworten:
Zeitstempel in MySQL werden im Allgemeinen verwendet, um Änderungen an Datensätzen zu verfolgen. Sie werden häufig jedes Mal aktualisiert, wenn der Datensatz geändert wird. Wenn Sie einen bestimmten Wert speichern möchten, sollten Sie ein Datum / Uhrzeit-Feld verwenden.
Wenn Sie sich zwischen einem UNIX-Zeitstempel oder einem nativen MySQL-Datum / Uhrzeit-Feld entscheiden möchten, wählen Sie das native Format. Auf diese Weise können Sie Berechnungen in MySQL durchführen,
("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)")
und es ist einfach, das Format des Werts in einen UNIX-Zeitstempel zu ändern,("SELECT UNIX_TIMESTAMP(my_datetime)")
wenn Sie den Datensatz abfragen, wenn Sie ihn mit PHP bearbeiten möchten.quelle
DATETIME
er ein Datum (wie in einem Kalender angegeben) und eine Uhrzeit (wie auf einer Wanduhr zu sehen) darstellt, währendTIMESTAMP
er einen genau definierten Zeitpunkt darstellt. Dies kann sehr wichtig sein, wenn Ihre Anwendung Zeitzonen verarbeitet. Wie lange ist '2010-09-01 16:31:00' her? Es hängt davon ab, in welcher Zeitzone Sie sich befinden. Für mich war es erst ein paar Sekunden her, für Sie könnte es eine Zeit in der Zukunft darstellen. Wenn ich 1283351460 Sekunden seit '1970-01-01 00:00:00 UTC' sage, wissen Sie genau, über welchen Zeitpunkt ich spreche. (Siehe Nirs ausgezeichnete Antwort unten). [Nachteil: gültiger Bereich].In MySQL 5 und höher werden TIMESTAMP- Werte zum Speichern von der aktuellen Zeitzone in UTC und zum Abrufen von UTC zurück in die aktuelle Zeitzone konvertiert. (Dies tritt nur für den TIMESTAMP-Datentyp und nicht für andere Typen wie DATETIME auf.)
Standardmäßig ist die aktuelle Zeitzone für jede Verbindung die Zeit des Servers. Die Zeitzone kann pro Verbindung festgelegt werden, wie in MySQL Server Time Zone Support beschrieben .
quelle
Ich verwende DATETIME-Felder immer für andere als Zeilenmetadaten (Erstellungsdatum oder Änderungsdatum).
Wie erwähnt in der MySQL - Dokumentation:
Es ist sehr wahrscheinlich, dass Sie die Untergrenze für TIMESTAMPs im allgemeinen Gebrauch erreichen - z. B. das Speichern des Geburtsdatums.
quelle
new Date().getTime()
bereits einen 64-Bit-Wert.Die folgenden Beispiele zeigen, wie der
TIMESTAMP
Datumstyp die Werte geändert hat, nachdem dastime-zone to 'america/new_york'
WhereDATETIME
unverändert geändert wurde .Ich habe meine Antwort in einen Artikel umgewandelt, damit mehr Benutzer diese nützlichen MySQL: Datetime Versus Timestamp-Datentypen finden können .
quelle
DATETIME
änderte sich die effektive Zeit mit der ZeitzonenänderungTIMESTAMP
nicht, aber die menschliche Repräsentation tat es.set time_zone="america/new_york"
.Der Hauptunterschied besteht darin, dass DATETIME konstant ist, während TIMESTAMP von der
time_zone
Einstellung beeinflusst wird.Es ist also nur wichtig, wenn Sie Cluster über Zeitzonen hinweg synchronisiert haben oder in Zukunft haben könnten.
In einfacheren Worten: Wenn ich eine Datenbank in Australien habe und einen Speicherauszug dieser Datenbank nehme, um eine Datenbank in Amerika zu synchronisieren / zu füllen, wird der TIMESTAMP aktualisiert, um die Echtzeit des Ereignisses in der neuen Zeitzone wiederzugeben, während DATETIME dies tun würde spiegeln immer noch die Zeit des Ereignisses in der Au-Zeitzone wider .
Ein gutes Beispiel für die Verwendung von DATETIME dort, wo TIMESTAMP hätte verwendet werden sollen, ist Facebook, wo die Server nie ganz sicher sind, welche Zeit in verschiedenen Zeitzonen passiert ist. Einmal hatte ich ein Gespräch, in dem die Zeit sagte, dass ich auf Nachrichten antwortete, bevor die Nachricht tatsächlich gesendet wurde. (Dies könnte natürlich auch durch eine schlechte Zeitzonenübersetzung in der Messaging-Software verursacht worden sein, wenn die Zeiten nicht synchronisiert, sondern gebucht wurden.)
quelle
Ich treffe diese Entscheidung auf semantischer Basis.
Ich verwende einen Zeitstempel, wenn ich einen (mehr oder weniger) festen Zeitpunkt aufzeichnen muss. Zum Beispiel, wenn ein Datensatz in die Datenbank eingefügt wurde oder wenn eine Benutzeraktion stattgefunden hat.
Ich verwende ein Datum / Uhrzeit-Feld, wenn Datum / Uhrzeit beliebig eingestellt und geändert werden können. Zum Beispiel, wenn ein Benutzer spätere Änderungstermine speichern kann.
quelle
Ich empfehle, weder ein DATETIME- noch ein TIMESTAMP-Feld zu verwenden. Wenn Sie einen bestimmten Tag als Ganzes darstellen möchten (z. B. einen Geburtstag), verwenden Sie einen DATE-Typ. Wenn Sie jedoch spezifischer sind, sind Sie wahrscheinlich daran interessiert, einen tatsächlichen Moment im Gegensatz zu einer Einheit von aufzuzeichnen Zeit (Tag, Woche, Monat, Jahr). Verwenden Sie anstelle von DATETIME oder TIMESTAMP einen BIGINT und speichern Sie einfach die Anzahl der Millisekunden seit der Epoche (System.currentTimeMillis (), wenn Sie Java verwenden). Dies hat mehrere Vorteile:
Dieses Problem hängt eng damit zusammen, wie Sie einen Geldwert (dh 1,99 USD) in einer Datenbank speichern sollten. Sollten Sie eine Dezimalzahl oder den Geldtyp der Datenbank oder am schlimmsten ein Double verwenden? Alle drei Optionen sind aus vielen der oben genannten Gründe schrecklich. Die Lösung besteht darin, den Wert des Geldes mit BIGINT in Cent zu speichern und dann Cent in Dollar umzurechnen, wenn Sie dem Benutzer den Wert anzeigen. Die Aufgabe der Datenbank besteht darin, Daten zu speichern und diese Daten NICHT zu interpretieren. All diese ausgefallenen Datentypen, die Sie in Datenbanken (insbesondere Oracle) sehen, tragen wenig dazu bei und bringen Sie auf den Weg zur Lieferantenbindung.
quelle
TIMESTAMP ist 4 Bytes gegenüber 8 Bytes für DATETIME.
http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html
Aber wie Scronide sagte, hat es eine Untergrenze des Jahres 1970. Es ist großartig für alles, was in Zukunft passieren könnte;)
quelle
TIMESTAMP ist vier Bytes gegenüber acht Bytes für DATETIME.
Zeitstempel sind auch leichter in der Datenbank und werden schneller indiziert.
Der Typ DATETIME wird verwendet, wenn Sie Werte benötigen, die sowohl Datums- als auch Zeitinformationen enthalten. MySQL ruft DATETIME-Werte im Format 'JJJJ-MM-TT HH: MM: SS' ab und zeigt sie an. Der unterstützte Bereich ist '1000-01-01 00:00:00' bis '9999-12-31 23:59:59'.
Der Datentyp TIMESTAMP hat einen Bereich von '1970-01-01 00:00:01' UTC bis '2038-01-09 03:14:07' UTC. Es hat unterschiedliche Eigenschaften, abhängig von der MySQL-Version und dem SQL-Modus, in dem der Server ausgeführt wird.
quelle
Kommt wirklich auf die Anwendung an.
Ziehen Sie in Betracht, einen Zeitstempel eines Benutzers für einen Termin in Sanghai auf einem Server in New York festzulegen. Wenn der Benutzer eine Verbindung in Sanghai herstellt, greift er von einem gespiegelten Server in Tokio auf denselben Terminzeitstempel zu. Er wird den Termin in Tokio sehen, versetzt von der ursprünglichen New Yorker Zeit.
Für Werte, die die Benutzerzeit wie einen Termin oder einen Zeitplan darstellen, ist die Datumszeit besser. Damit kann der Benutzer unabhängig von den Servereinstellungen das genaue Datum und die gewünschte Uhrzeit steuern. Die eingestellte Zeit ist die eingestellte Zeit, die nicht von der Zeitzone des Servers, der Zeitzone des Benutzers oder von Änderungen in der Berechnung der Sommerzeit beeinflusst wird (ja, sie ändert sich).
Verwenden Sie für Werte, die die Systemzeit darstellen, wie Zahlungstransaktionen, Tabellenänderungen oder Protokollierung, immer Zeitstempel. Das System ist nicht betroffen, wenn der Server in eine andere Zeitzone verschoben wird oder wenn Server zwischen verschiedenen Zeitzonen verglichen werden.
Zeitstempel sind auch leichter in der Datenbank und werden schneller indiziert.
quelle
2016 + : Ich rate Ihnen, Ihre MySQL-Zeitzone auf UTC einzustellen und DATETIME zu verwenden:
Jedes aktuelle Front-End-Framework (Angular 1/2, React, Vue, ...) kann Ihre UTC-Datums- und Uhrzeitangabe einfach und automatisch in Ortszeit umwandeln.
Zusätzlich:
(Es sei denn, Sie ändern wahrscheinlich die Zeitzone Ihrer Server.)
Beispiel mit AngularJs
Alle lokalisierten Zeitformate finden Sie hier: https://docs.angularjs.org/api/ng/filter/date
quelle
SET time_zone = '+0:00';
für UTC.Ein
timestamp
Feld ist ein Sonderfall desdatetime
Feldes. Sie könnentimestamp
Spalten mit speziellen Eigenschaften erstellen . Es kann so eingestellt werden, dass es sich beim Erstellen und / oder Aktualisieren selbst aktualisiert.In "größeren" Datenbankbegriffen
timestamp
enthält es einige Sonderfallauslöser.Was das Richtige ist, hängt ganz davon ab, was Sie tun möchten.
quelle
TIMESTAMP ist immer in UTC (dh Sekunden seit dem 01.01.1970 in UTC), und Ihr MySQL-Server konvertiert es automatisch in das Datum / die Uhrzeit für die Verbindungszeitzone. Langfristig ist TIMESTAMP der richtige Weg, da Sie wissen, dass Ihre zeitlichen Daten immer in UTC vorliegen. Zum Beispiel werden Sie Ihre Daten nicht vermasseln, wenn Sie auf einen anderen Server migrieren oder wenn Sie die Zeitzoneneinstellungen auf Ihrem Server ändern.
Hinweis: Die Standardverbindungszeitzone ist die Serverzeitzone, diese kann (sollte) jedoch pro Sitzung geändert werden (siehe
SET time_zone = ...
).quelle
Vergleich zwischen DATETIME, TIMESTAMP und DATE
Was ist das [.fraktion]?
Quellen:
quelle
Ich würde immer einen Unix-Zeitstempel verwenden, wenn ich mit MySQL und PHP arbeite. Der Hauptgrund dafür ist, dass die Standard- Datumsmethode in PHP einen Zeitstempel als Parameter verwendet, sodass keine Analyse erforderlich ist.
Um den aktuellen Unix-Zeitstempel in PHP zu erhalten, tun Sie dies einfach
time();
und in MySQL
SELECT UNIX_TIMESTAMP();
.quelle
Es ist erwähnenswert, dass Sie in MySQL beim Erstellen Ihrer Tabellenspalten Folgendes verwenden können:
Dies aktualisiert die Zeit bei jeder Instanz, in der Sie eine Zeile ändern, und ist manchmal sehr hilfreich für gespeicherte Informationen zur letzten Bearbeitung. Dies funktioniert nur mit Zeitstempel, nicht jedoch mit Datum / Uhrzeit.
quelle
Wenn Sie nach meinen Erfahrungen ein Datumsfeld wünschen, in das das Einfügen nur einmal erfolgt und Sie keine Aktualisierung oder andere Aktion für dieses bestimmte Feld wünschen, gehen Sie zur Datums- und Uhrzeitangabe .
Betrachten Sie beispielsweise eine
user
Tabelle mit einem Feld REGISTRIERUNGSDATUM .user
Wenn Sie in dieser Tabelle die zuletzt angemeldete Zeit eines bestimmten Benutzers wissen möchten, verwenden Sie ein Feld vom Typ Zeitstempel, damit das Feld aktualisiert wird.Wenn Sie die Tabelle aus phpMyAdmin erstellen, aktualisiert die Standardeinstellung das Zeitstempelfeld , wenn eine Zeilenaktualisierung erfolgt. Wenn Ihr Zeitstempel nicht mit Zeilenaktualisierung aktualisiert wird, können Sie die folgende Abfrage verwenden, um ein Zeitstempelfeld automatisch zu aktualisieren.
quelle
Der Zeitstempeldatentyp speichert Datum und Uhrzeit, jedoch im UTC-Format, nicht im aktuellen Zeitzonenformat wie datetime. Und wenn Sie Daten abrufen, konvertiert der Zeitstempel diese erneut in die aktuelle Zeitzonenzeit.
Angenommen, Sie befinden sich in den USA und erhalten Daten von einem Server mit einer Zeitzone von USA. Dann erhalten Sie Datum und Uhrzeit gemäß der Zeitzone USA. Die Spalte mit dem Zeitstempeldatentyp wird immer automatisch aktualisiert, wenn ihre Zeile aktualisiert wird. Daher kann es nützlich sein zu verfolgen, wann eine bestimmte Zeile das letzte Mal aktualisiert wurde.
Weitere Informationen finden Sie im Blog-Beitrag Timestamp Vs Datetime .
quelle
SET time_zone = '+0:00';
(UTC hier) definieren, um sicherzugehen, was Sie von denTIMESTAMP
Werten erhalten / festlegen , und vermeiden, dass sich die Standardeinstellung des Servers time_zone ändert.Ich verwende immer einen Unix-Zeitstempel, um die Vernunft beim Umgang mit vielen Datums- / Uhrzeitinformationen zu gewährleisten, insbesondere beim Anpassen von Zeitzonen, Hinzufügen / Subtrahieren von Datumsangaben und dergleichen. Wenn Sie Zeitstempel vergleichen, schließt dies die komplizierenden Faktoren der Zeitzone aus und ermöglicht es Ihnen, Ressourcen in Ihrer serverseitigen Verarbeitung (ob Anwendungscode oder Datenbankabfragen) zu schonen, indem Sie eher eine leichte Arithmetik als eine schwerere Addition / Subtraktion von Datum und Uhrzeit verwenden Funktionen.
Eine weitere erwägenswerte Sache:
Wenn Sie eine Anwendung erstellen, wissen Sie nie, wie Ihre Daten später verwendet werden müssen. Wenn Sie beispielsweise eine Reihe von Datensätzen in Ihrem Datensatz mit beispielsweise einer Reihe von Elementen aus einer Drittanbieter-API vergleichen und diese in chronologischer Reihenfolge anordnen müssen, sind Sie froh, dass Sie diese haben Unix-Zeitstempel für Ihre Zeilen. Selbst wenn Sie sich für die Verwendung von MySQL-Zeitstempeln entscheiden, speichern Sie einen Unix-Zeitstempel als Versicherung.
quelle
In meinem Fall habe ich UTC als Zeitzone für alles festgelegt: das System, den Datenbankserver usw., wann immer ich kann. Wenn mein Kunde eine andere Zeitzone benötigt, konfiguriere ich diese in der App.
Ich bevorzuge fast immer Zeitstempel anstelle von Datums- / Uhrzeitfeldern, da Zeitstempel implizit die Zeitzone enthalten. Da Benutzer aus verschiedenen Zeitzonen auf die App zugreifen und sie Datums- und Uhrzeitangaben in ihrer lokalen Zeitzone anzeigen möchten, ist dies mit diesem Feldtyp ziemlich einfach, als wenn die Daten in Datums- / Uhrzeitfeldern gespeichert würden .
Als Plus würde ich mich bei einer Migration der Datenbank auf ein System mit einer anderen Zeitzone sicherer fühlen, wenn ich Zeitstempel verwenden würde. Ganz zu schweigen von möglichen Problemen bei der Berechnung von Differenzen zwischen zwei Momenten mit einer dazwischen liegenden Änderung der Sommerzeit und einer Genauigkeit von 1 Stunde oder weniger.
Zusammenfassend schätze ich diese Vorteile des Zeitstempels:
Aus all diesen Gründen wähle ich UTC- und Zeitstempelfelder, wo dies möglich ist. Und ich vermeide Kopfschmerzen;)
quelle
warranties.expires_at
könnte heute kein MySQL-Zeitstempel sein.Achten Sie darauf, dass sich der Zeitstempel nicht ändert, wenn Sie eine UPDATE-Anweisung für eine Tabelle ausführen. Wenn Sie eine Tabelle mit den Spalten 'Name' (varchar), 'Age' (int) und 'Date_Added' (Zeitstempel) haben und die folgende DML-Anweisung ausführen
Dann wird jeder einzelne Wert in Ihrer Spalte "Date_Added" in den aktuellen Zeitstempel geändert.
quelle
ON UPDATE CURRENT_TIMESTAMP
Verweis aus diesem Artikel:
Die Hauptunterschiede:
TIMESTAMP wird verwendet, um Änderungen an Datensätzen zu verfolgen und jedes Mal zu aktualisieren, wenn der Datensatz geändert wird. DATETIME wird zum Speichern eines bestimmten und statischen Werts verwendet, der von Änderungen in Datensätzen nicht betroffen ist.
TIMESTAMP wird auch von verschiedenen Einstellungen für die ZEITZONE beeinflusst. DATETIME ist konstant.
TIMESTAMP konvertierte die aktuelle Zeitzone zur Speicherung intern in UTC und 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 ′
quelle
quelle
Ein weiterer Unterschied zwischen Zeitstempel und Datumszeit besteht darin, dass Sie im Zeitstempel den Standardwert nicht auf NULL setzen können.
quelle
CREATE TABLE t2 ( ts1 TIMESTAMP NULL, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
Die erste Spalte kann den Wert NULL akzeptieren.Ich fand unübertroffene Nützlichkeit in der Fähigkeit von TIMESTAMP, sich basierend auf der aktuellen Zeit automatisch zu aktualisieren, ohne unnötige Trigger zu verwenden. Das bin nur ich, obwohl TIMESTAMP wie gesagt UTC ist.
Es kann über verschiedene Zeitzonen hinweg verfolgt werden. Wenn Sie beispielsweise eine relative Zeit anzeigen müssen, ist die UTC-Zeit genau das, was Sie möchten.
quelle
Der Hauptunterschied ist
In diesem Beitrag finden Sie Probleme mit der Datetime-Indizierung
quelle
Ich habe die Verwendung
datetime
in meinen Anwendungen eingestellt, nachdem ich auf viele Probleme und Fehler in Bezug auf Zeitzonen gestoßen war. IMHO Verwendungtimestamp
ist besser alsdatetime
in den meisten Fällen .Wenn Sie fragen, wie spät ist es? und die Antwort kommt so etwas wie '2019-02-05 21:18:30', das ist nicht abgeschlossen, nicht definierte Antwort, weil es keinen anderen Teil gibt, in welcher Zeitzone? Washington? Moskau? Peking?
Die Verwendung von Datumszeiten ohne Zeitzone bedeutet, dass Ihre Anwendung nur mit einer Zeitzone arbeitet. Zeitstempel bieten Ihnen jedoch die Vorteile
datetime
und die Flexibilität, denselben genauen Zeitpunkt in verschiedenen Zeitzonen anzuzeigen.In den folgenden Fällen bereuen Sie die Verwendung
datetime
und möchten, dass Sie Ihre Daten in Zeitstempeln gespeichert haben.Für den Komfort Ihrer Kunden möchten Sie ihnen die Zeiten basierend auf ihren bevorzugten Zeitzonen anzeigen, ohne dass sie rechnen müssen, und die Zeit in ihre aussagekräftige Zeitzone umrechnen. Sie müssen lediglich die Zeitzone ändern, und Ihr Anwendungscode ist identisch. (Eigentlich sollten Sie die Zeitzone immer zu Beginn der Anwendung definieren oder die Verarbeitung bei PHP-Anwendungen anfordern.)
Sie haben das Land geändert, in dem Sie sich aufhalten, und setzen Ihre Arbeit zur Pflege der Daten fort, während Sie sie in einer anderen Zeitzone anzeigen (ohne die tatsächlichen Daten zu ändern).
Zusamenfassend
datetime
= Anwendung unterstützt 1 Zeitzone (zum Einfügen und Auswählen)timestamp
= Anwendung unterstützt jede Zeitzone (sowohl zum Einfügen als auch zum Auswählen)Diese Antwort dient nur dazu, die Flexibilität und Leichtigkeit von Zeitstempeln in Bezug auf Zeitzonen hervorzuheben. Sie deckt keine anderen Unterschiede wie die Spaltengröße, den Bereich oder den Bruch ab .
quelle
date
werden und andere Feldertimestamp
in einer Tabelle verwendet werden ? Ich denke, es wird ein neues Problem verursachen, da die Daten, nach denen gefiltertwhere
wird, nicht den Zeitzonenänderungen entsprechen.date
Spalte beheben, bevor Sie die Abfrage senden.Ich bevorzuge die Verwendung eines Zeitstempels, um alles in einem gemeinsamen Rohformat zu halten und die Daten in PHP-Code oder in Ihrer SQL-Abfrage zu formatieren. Es gibt Fälle, in denen es in Ihrem Code nützlich ist, alles in Sekundenschnelle zu halten.
quelle
A
TIMESTAMP
benötigt 4 Bytes, während aDATETIME
8 Bytes benötigt.quelle
Ich mag einen Unix-Zeitstempel, weil Sie in Zahlen konvertieren können und sich nur um die Zahl kümmern müssen. Außerdem addieren / subtrahieren Sie und erhalten Dauern usw. Konvertieren Sie dann das Ergebnis in ein Datum in einem beliebigen Format. Dieser Code ermittelt, wie viel Zeit in Minuten zwischen einem Zeitstempel aus einem Dokument und der aktuellen Zeit vergangen ist.
quelle