Frage Sollte ich den Datetime- oder Timestamp-Datentyp in MySQL verwenden?


Würden Sie die Verwendung eines. Empfehlen? Terminzeit oder ein Zeitstempel Feld und warum (mit MySQL)?

Ich arbeite mit PHP auf der Serverseite.


2299
2018-01-03 16:14


Ursprung


Antworten:


Zeitstempel in MySQL werden im Allgemeinen verwendet, um Änderungen an Datensätzen zu verfolgen, und werden oft jedes Mal aktualisiert, wenn der Datensatz geändert wird. Wenn Sie einen bestimmten Wert speichern möchten, sollten Sie ein Datetime-Feld verwenden.

Wenn Sie beabsichtigen, sich für die Verwendung eines UNIX-Zeitstempels oder eines nativen MySQL-Datetime-Felds zu entscheiden, verwenden Sie das native Format. Sie können auf diese Weise Berechnungen in MySQL durchführen ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)") und es ist einfach, das Format des Wertes in einen UNIX-Zeitstempel zu ändern ("SELECT UNIX_TIMESTAMP(my_datetime)") wenn Sie den Datensatz abfragen, wenn Sie mit PHP arbeiten wollen.


1555
2018-01-03 16:26



In MySQL 5 und höher ZEITSTEMPEL Werte werden für die Speicherung von der aktuellen Zeitzone in UTC konvertiert und zum Abrufen von UTC zurück in die aktuelle Zeitzone konvertiert. (Dies geschieht nur für den Datentyp TIMESTAMP und nicht für andere Typen wie DATETIME.)

Standardmäßig ist die aktuelle Zeitzone für jede Verbindung die Serverzeit. Die Zeitzone kann pro Verbindung wie in beschrieben eingestellt werden MySQL Server-Zeitzonenunterstützung.


814
2018-03-02 11:49



Ich verwende DATETIME-Felder immer für alles andere als Zeilenmetadaten (Datum erstellt oder geändert).

Wie erwähnt in der MySQL-Dokumentation:

Der DATETIME-Typ 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. Abhängig von der MySQL-Version und dem SQL-Modus, in dem der Server läuft, hat es unterschiedliche Eigenschaften.

Es ist sehr wahrscheinlich, dass Sie die untere Grenze für TIMESTAMPs im allgemeinen Gebrauch - z. Geburtsdatum speichern.


430
2018-01-04 04:26



Die folgenden Beispiele zeigen, wie die TIMESTAMP Datumstyp änderte die Werte nach dem Ändern der time-zone to 'america/new_york' woher DATETIMEist unverändert.

mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name    | Value               |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone        | Asia/Calcutta       |
+------------------+---------------------+

mysql> create table datedemo(
    -> mydatetime datetime,
    -> mytimestamp timestamp
    -> );

mysql> insert into datedemo values ((now()),(now()));

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+

mysql> set time_zone="america/new_york";

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+

Ich habe meine Antwort in einen Artikel umgewandelt, damit mehr Leute das nützlich finden können. MySQL: Datetime Versus Timestamp Datentypen.


284
2017-08-21 08:45



Der Hauptunterschied besteht darin, dass DATETIME konstant ist, während TIMESTAMP von der Funktion beeinflusst wird time_zone Rahmen.

Es spielt also nur eine Rolle, wenn Sie Cluster über verschiedene Zeitzonen hinweg synchronisiert haben oder in Zukunft haben.

In einfacheren Worten: Wenn ich eine Datenbank in Australien habe und einen Dump dieser Datenbank mache, um eine Datenbank in Amerika zu synchronisieren / aufzufüllen, würde der TIMESTAMP aktualisieren, um die Echtzeit des Ereignisses in der neuen Zeitzone zu reflektieren, während DATETIME immer noch die Zeit widerspiegelt des Ereignisses in der Zeitzone.

Ein gutes Beispiel für DATETIME, wo TIMESTAMP verwendet werden sollte, ist Facebook, wo ihre Server nie ganz sicher sind, welche Zeit in den verschiedenen Zeitzonen passiert. Sobald ich eine Unterhaltung hatte, in der 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 gepostet und nicht synchronisiert wurden.)


169
2018-01-14 14:26



Ich treffe diese Entscheidung auf eine semantische Basis.

Ich benutze 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 Datetime-Feld, wenn Datum / Uhrzeit beliebig eingestellt und geändert werden kann. Zum Beispiel, wenn ein Benutzer spätere Änderungstermine speichern kann.


109
2018-01-03 17:11



TIMESTAMP ist 4 Bytes Vs 8 Bytes für DATETIME.

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

Aber wie scronide sagte es hat eine untere Grenze des Jahres 1970. Es ist toll für alles, was in der Zukunft passieren könnte;)


86
2018-01-04 09:00



  1. TIMESTAMP ist vier Bytes gegenüber acht Bytes für DATETIME.

  2. Zeitstempel sind in der Datenbank auch leichter und schneller indexiert.

  3. Der DATETIME-Typ 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. Abhängig von der MySQL-Version und dem SQL-Modus, in dem der Server läuft, hat es unterschiedliche Eigenschaften.

  1. DATETIME ist konstant, während TIMESTAMP durch die Einstellung time_zone beeinflusst wird.

80
2017-12-21 11:12



Ich empfehle die Verwendung weder ein DATETIME- oder TIMESTAMP-Feld. Wenn Sie einen bestimmten Tag als Ganzes darstellen möchten (z. B. einen Geburtstag), verwenden Sie einen DATE-Typ. Wenn Sie jedoch genauer sind, möchten Sie wahrscheinlich einen tatsächlichen Moment im Gegensatz zu einer Einheit von 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:

  1. Sie vermeiden die Herstellerbindung. So ziemlich jede Datenbank unterstützt Ganzzahlen auf relativ ähnliche Weise. Angenommen, Sie möchten zu einer anderen Datenbank wechseln. Möchten Sie sich über die Unterschiede zwischen den DATETIME-Werten von MySQL und deren Definition durch Oracle Sorgen machen? Sogar unter verschiedenen Versionen von MySQL haben TIMESTAMPS eine andere Genauigkeitsstufe. Es war erst vor kurzem, dass MySQL Millisekunden in den Zeitstempeln unterstützte.
  2. Keine Zeitzonenprobleme. Es gab einige aufschlussreiche Kommentare darüber, was mit Zeitzonen mit den verschiedenen Datentypen passiert. Aber ist das allgemein bekannt und werden sich Ihre Kollegen die Zeit nehmen, es zu lernen? Auf der anderen Seite ist es ziemlich schwer, einen BigINT in einen java.util.Date zu verwandeln. Die Verwendung eines BIGINT verursacht viele Probleme mit Zeitzonen, die auf der Strecke bleiben.
  3. Keine Sorgen über Reichweiten oder Präzision. Sie müssen sich keine Sorgen darüber machen, was in zukünftigen Datumsbereichen abgeschnitten wird (TIMESTAMP geht nur bis 2038).
  4. Werkzeugintegration von Drittanbietern Durch die Verwendung einer Ganzzahl ist es für die Werkzeuge von Drittanbietern (z. B. EclipseLink) trivial, mit der Datenbank zu kommunizieren. Nicht jedes Tool von Drittanbietern wird dasselbe Verständnis von "Datetime" haben wie MySQL. Möchten Sie in Hibernate herausfinden, ob Sie ein java.sql.TimeStamp- oder java.util.Date-Objekt verwenden sollten, wenn Sie diese benutzerdefinierten Datentypen verwenden? Unter Verwendung Ihrer Basisdatentypen wird make mit Drittanbieter-Tools trivial verwendet.

Dieses Problem hängt eng damit zusammen, wie Sie einen Geldwert (d. H. 1,99 $) in einer Datenbank speichern sollten. Sollten Sie ein Dezimalsystem oder den Money-Typ der Datenbank verwenden oder das Schlimmste eines Double? Alle 3 dieser Optionen sind schrecklich, aus den gleichen Gründen, die oben aufgeführt sind. Die Lösung besteht darin, den Wert des Geldes in Cent mit BIGINT zu speichern und dann Cent in Dollar umzurechnen, wenn Sie den Wert für den Benutzer anzeigen. Die Aufgabe der Datenbank besteht darin, Daten zu speichern und diese Daten NICHT zu vererben. Alle diese fantastischen Datentypen, die Sie in Datenbanken sehen (besonders Oracle), tragen wenig dazu bei, Sie auf den Weg zur Herstellerbindung zu führen.


74
2018-06-11 23:02



Hängt von der Anwendung ab, wirklich.

Ziehen Sie in Betracht, einen Zeitstempel eines Benutzers für einen Termin in Sanghai auf einen Server in New York zu setzen. Wenn der Benutzer jetzt in Sanghai eine Verbindung herstellt, greift er auf denselben Terminstempel von einem gespiegelten Server in Tokio zu. Er sieht den Termin in Tokyo Zeit, versetzt von der ursprünglichen New Yorker Zeit.

Für Werte, die Benutzerzeit wie einen Termin oder einen Zeitplan darstellen, ist datetime besser. Es erlaubt dem Benutzer, das genaue Datum und die gewünschte Zeit unabhängig von den Servereinstellungen zu 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, es ändert sich).

Für Werte, die die Systemzeit darstellen, wie Zahlungstransaktionen, Tabellenänderungen oder Protokollierung, werden dagegen immer Zeitstempel verwendet. Das System wird nicht durch Verschieben des Servers in eine andere Zeitzone oder beim Vergleich zwischen Servern in verschiedenen Zeitzonen beeinflusst.

Zeitstempel sind in der Datenbank auch leichter und schneller indexiert.


37
2017-10-26 21:07



EIN timestamp Feld ist ein Sonderfall der datetime Feld. Sie können erstellen timestamp Spalten haben spezielle Eigenschaften; Es kann so eingestellt werden, dass es sich entweder beim Erstellen und / oder Aktualisieren aktualisiert.

In "größeren" Datenbankbegriffen, timestamp hat ein paar Sonderfälle Auslöser.

Was der Richtige ist, hängt ganz davon ab, was Sie tun möchten.


30
2018-01-03 16:21