Frage

Würden Sie empfehlen, mit einem datetime oder Zeitstempel Feld, und warum (mit MySQL)?

Ich arbeite mit PHP auf der server-Seite.

War es hilfreich?

Lösung

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

Wenn Sie bedeutet, dass Sie zwischen der Verwendung eines UNIX-Zeitstempel oder eine native MySQL Datetime-Feld entscheiden möchten, gehen Sie mit dem nativen Format. Sie können Berechnungen innerhalb MySQL tun auf diese Weise ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)") und es ist einfach das Format des Wertes auf UNIX Zeitpunkt ("SELECT UNIX_TIMESTAMP(my_datetime)") zu ändern, wenn Sie den Datensatz abfragen, wenn Sie auf es mit PHP betreiben wollen.

Andere Tipps

In MySQL 5 und höher, TIMESTAMP werden die Werte aus der aktuellen Zeitzone UTC zur Speicherung umgewandelt und konvertierten zum Abruf von UTC in der aktuellen Zeitzone zurück. (Dies geschieht nur für den Datentyp TIMESTAMP und nicht für andere Arten wie DATETIME-.)

In der Standardeinstellung ist die aktuelle Zeitzone für jede Verbindung der Zeit des Servers. Die Zeitzone kann auf einer pro Verbindung eingestellt werden, wie in MySQL Server Zeitzonen-Unterstützung .

Ich benutze immer DATETIME- Felder für etwas anderes als Reihe Metadaten (Datum erstellt oder geändert).

Wie erwähnt in der MySQL-Dokumentation:

  

Der DATETIME--Typ verwendet wird, wenn Sie Werte benötigen, die sowohl Datums- und Zeitinformationen enthalten. MySQL abruft und anzeigt DATETIME- Werte in 'YYYY-MM-DD HH: MM: SS' Format. Unterstützt wird der Bereich ‚1000.01.01 00.00.00‘ auf ‚9999-12-31 23.59.59‘.

     

...

     

Der Datentyp TIMESTAMP hat eine Reichweite von ‚1970-01-01 00.00.01‘ UTC ‚2038.01.09 03.14.07‘ UTC. Es hat unterschiedliche Eigenschaften, abhängig von der MySQL-Version und der SQL-Modus der Server aktiv ist.

Sie sind sehr wahrscheinlich die untere Grenze für Zeitstempel in der allgemeinen Gebrauch treffen - zum Beispiel Speichern von birth.

Die folgenden Beispiele zeigen, wie die TIMESTAMP Datumsart die Werte nach dem Ändern der time-zone to 'america/new_york' geändert, wo DATETIMEis 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 Artikel konvertiert so mehr Menschen diese nützlich finden, MySQL. Datetime-Versus-Zeitstempel-Datentypen

Der Hauptunterschied besteht darin, dass DATETIME- konstant ist, während TIMESTAMP durch die time_zone Einstellung beeinflusst wird.

So ist es nur wichtig, wenn Sie haben - oder auch in der Zukunft -. Synchronisierten Cluster über Zeitzonen

In einfacheren Worten: Wenn ich eine Datenbank in Australien haben, und nehmen Sie einen Dump dieser Datenbank zu synchronisieren / füllen eine Datenbank in Amerika, dann den Zeitstempel würde aktualisieren, um die Echtzeit der Veranstaltung in der neuen widerzuspiegeln Zeitzone, während DATETIME- noch die Zeit der Veranstaltung in der au-Zeitzone widerspiegeln würde .

Ein gutes Beispiel für DATETIME- eingesetzt, in denen TIMESTAMP verwendet wurden, sollten in Facebook ist, wo ihre Server sind nie ganz sicher, welche Zeit Dinge über Zeitzonen hinweg passiert ist. Einmal war ich die Zeit, in der ein Gespräch sagte ich zu Nachrichten wurde antworten, bevor die Nachricht tatsächlich gesendet wurde. (Dies könnte natürlich auch durch schlechte Zeitzone Übersetzung in der Messaging-Software verursacht wurde, wenn die Zeiten nicht synchronisiert geschrieben wurden.)

Ich mache diese Entscheidung auf einer semantischen Basis.

Ich verwende einen Zeitstempel, wenn ich einen (mehr oder weniger) aufnehmen muß fester Zeitpunkt. Zum Beispiel, wenn ein Datensatz in die Datenbank eingefügt oder wenn einige Benutzer Aktion stattfand.

Ich benutze ein Datetime-Feld, wenn das Datum / Uhrzeit einstellen und kann beliebig geändert werden. Zum Beispiel, wenn ein Benutzer später ändern Termine speichern.

Zeitstempel 4 Bytes Vs 8 Byte für DATETIME-.

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

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

Ich empfehle, mit weder ein DATETIME- oder ein Timestamp-Feld. Wenn Sie einen bestimmten Tag als Ganzes darstellen wollen (wie ein Geburtstag), dann einen DATE-Typ verwenden, aber wenn Sie präziser als das sein, sind Sie wahrscheinlich daran interessiert, einen tatsächlichen Moment der Aufnahme im Gegensatz zu einer Einheit Zeit (Tag, Woche, Monat, Jahr). Statt eine DATETIME- oder Zeitstempel verwenden, verwenden Sie eine BIGINT und einfach speichern die Anzahl der Millisekunden seit Beginn der Epoche (System.currentTimeMillis (), wenn Sie Java verwenden). Dies hat mehrere Vorteile:

  1. Sie vermeiden Vendor Lock-in. So ziemlich jede Datenbank unterstützt ganze Zahlen in der relativ ähnlichen Weise. Angenommen, Sie in eine andere Datenbank verschieben möchten. Wollen Sie über die Unterschiede zwischen MySQL DATETIME- Werte kümmern und wie Oracle definiert sie? Selbst unter verschiedenen Versionen von MySQL, haben Zeitstempel ein anderes Maß an Präzision. Es war erst vor kurzem, dass MySQL Millisekunden in dem Zeitstempel unterstützt.
  2. Keine Zeitzone Fragen. Es gibt einige interessante Kommentare waren hier auf das, was mit Zeitzonen mit den verschiedenen Datentypen geschieht. Aber das ist allgemein bekannt und werden Ihre Mitarbeiter nehmen die ganze Zeit, es zu lernen? Auf der anderen Seite, es ist ziemlich schwer zu vermasseln eine BigInt in eine java.util.Date ändern. eine BIGINT Der Verwendung verursacht mit Zeitzonen in einer Menge von Fragen auf der Strecke fallen.
  3. Keine Sorgen über Bereiche oder Präzision. Sie müssen sich nicht darum kümmern, was durch zukünftige Zeiträume kurz geschnitten werden (Zeitstempel geht nur bis 2038).
  4. Drittanbieter-Tool-Integration. Durch die Verwendung einer ganzen Zahl, dann ist es trivial für 3rd-Party-Tools (z Eclipse) mit der Datenbank zu verbinden. Nicht jeder Drittanbieter-Tool wird das gleiche Verständnis eines „Datetime“ haben, wie MySQL tut. Möchten Sie in den Ruhezustand versuchen, herauszufinden, ob Sie eine java.sql.Timestamp oder java.util.Date Objekt verwenden sollten, wenn Sie diese benutzerdefinierten Datentypen verwenden? Ihre Basisdatentypen der mit 3rd-Party-Tools trivial nutzen machen.

Dieses Problem ist eng verwandt, wie Sie einen Geld-Wert gespeichert werden sollen (das heißt $ 1.99) in einer Datenbank. Sollten Sie eine Dezimal verwenden, oder das Geld Typ der Datenbank, oder am schlechtesten von allen Doppel? Alle drei dieser Optionen sind schrecklich, für viele der gleichen oben genannten Gründen. Die Lösung ist, den Wert des Geldes in Cent zu speichern BIGINT verwendet wird, und dann Cent auf Dollar konvertieren, wenn Sie den Wert für den Benutzer anzuzeigen. Die Aufgabe der Datenbank ist, Daten zu speichern und diese Daten nicht auf Spaltenbindung. All diese Phantasie Datentypen, die Sie in Datenbanken sehen (insbesondere Oracle) in wenig, und starten Sie die Straße hinunter zu Vendor Lock-in.

  1. Zeitstempel vier Bytes vs acht Bytes für DATETIME-.

  2. Zeitstempel sind auch leichter auf die Datenbank und indiziert schneller.

  3. Der DATETIME--Typ verwendet wird, wenn Sie Werte benötigen, die sowohl Datums- und Zeitinformationen enthalten. MySQL abruft und anzeigt DATETIME- Werte in ‚YYYY-MM-DD HH: MM: SS‘ Format. Unterstützt wird der Bereich ‚1000.01.01 00.00.00 'auf‚9999-12-31 23.59.59'.

Der Datentyp TIMESTAMP hat eine Reichweite von ‚1970-01-01 00.00.01 'UTC‚2038.01.09 03.14.07' UTC. Es hat unterschiedliche Eigenschaften, abhängig von der MySQL-Version und der SQL-Modus der Server aktiv ist.

  1. DATETIME- ist konstant, während TIMESTAMP durch die time_zone Einstellung erfolgt.

Abhängig von der Anwendung, wirklich.

Betrachten Sie einen Zeitstempel von einem Benutzer an einen Server in New York, für einen Termin in Sanghai Einstellung. Nun, wenn der Benutzer in Sanghai verbindet, er greift auf den gleichen Termin Zeitstempel von einem gespiegelten Server in Tokio. Er wird den Termin in Tokio Zeit versetzt von der ursprünglichen New Yorker Zeit sehen.

So für Werte, die Benutzer Zeit wie ein Termin oder einen Zeitplan darstellen, Datetime ist besser. Es ermöglicht dem Benutzer, das genaue Datum und die gewünschte Zeit zu steuern, unabhängig von den Servereinstellungen. Die eingestellte Zeit ist die eingestellte Zeit, nicht von der Server-Zeitzone betroffen, die Zeitzone des Benutzers oder durch Änderungen in der Sommerzeit Art und Weise berechnet wird (ja, es tut ändern).

Auf der anderen Seite, für Werte, die Systemzeit wie Zahlungsverkehr, Tabellenänderungen oder Protokollierung darstellen, immer Zeitstempel verwenden. Das System wird nicht durch die Bewegung des Servers auf einem anderen Zeitzone beeinflusst werden, oder wenn zwischen Servern in unterschiedlichen Zeitzonen zu vergleichen.

Zeitstempel sind auch leichter auf die Datenbank und indiziert schneller.

2016 + : was ich rate ist Ihre Mysql Zeitzone UTC zu setzen und verwenden DATETIME-:

Alle bisherigen Front-End-Rahmen (Angular 1/2, reagieren, Vue, ...) können einfach und automatisch UTC Datetime Ortszeit konvertieren.

Zusätzlich:

Ein timestamp Feld ist ein Spezialfall des datetime Feldes. Sie können timestamp Spalten haben spezielle Eigenschaften zu schaffen; es kann selbst eingestellt wird auf aktualisieren entweder erstellen und / oder zu aktualisieren.

„größer“ Datenbank Begriffe, timestamp hat ein paar Spezialfall löst auf sich.

Was ist die richtige ist, hängt ganz auf das, was Sie tun möchten.

Zeitstempel werden immer in UTC (das heißt, verstrichenen Sekunden seit 1970-01-01, in UTC) und MySQL-Server automatisch konvertiert es in das Datum / Uhrzeit für die Verbindungszeitzone. Auf lange Sicht ist TIMESTAMP der Weg zu gehen, weil Sie Ihre Zeitdaten wissen immer in UTC sein wird. Zum Beispiel werden Sie nicht schrauben Sie bitte das Datum, wenn Sie auf einen anderen Server migrieren oder wenn Sie die Zeitzoneneinstellungen auf dem Server ändern.

. Hinweis: Standardverbindung Zeitzone ist die Server-Zeitzone, aber dies kann (soll) pro Sitzung geändert werden (siehe SET time_zone = ...)

Vergleich zwischen DATETIME-, Zeitstempel- und DATE

 image description hier

Was ist das [.fraction]?

  • A DATETIME- oder TIMESTAMP-Wert kann eine Hinter fraktionierten umfassen Teil Sekunden in bis zu Mikrosekunden (6-stellig) Präzision. Im Insbesondere bei einem Wert eines beliebigen Bruchteil in eine DATETIME- eingefügt oder TIMESTAMP-Spalte wird nicht verworfen gespeichert. Das ist natürlich optional.

Quellen:

Es lohnt sich in MySQL unter Hinweis darauf, Sie etwas entlang der Linien der unten verwenden können, wenn Ihre Tabellenspalten zu erstellen:

on update CURRENT_TIMESTAMP

Das wird die Zeit aktualisiert bei jeder Instanz eine Zeile, die Sie ändern und ist manchmal sehr nützlich für gespeicherte zuletzt Informationen. Dies funktioniert nur mit Zeitstempel, nicht Datetime jedoch.

Ich würde immer einen Unix-Zeitstempel verwenden, wenn sie mit MySQL und PHP arbeiten. Der Hauptgrund für dieses ist die Standard Datum Methode in PHP verwendet ein Zeitstempel als Parameter, so gäbe es kein Parsing erforderlich.

den aktuellen Unix-Zeitstempel in PHP zu erhalten, haben nur time();
und in MySQL tun SELECT UNIX_TIMESTAMP();.

Aus meinen Erfahrungen, wenn Sie ein Datumsfeld wollen, in dem Einsetzen nur einmal passiert, und Sie wollen kein Update oder eine andere Aktion auf diesem speziellen Bereich, gehen Sie mit Datum Zeit .

Betrachten wir zum Beispiel eine user Tabelle mit einem ANMELDUNG DATUM ein. In dieser user Tabelle, wenn Sie die letzten eingeloggt Zeit von einem bestimmten Benutzer wissen wollen, gehen Sie mit einem Feld von Zeitstempeln Typ, so dass das Feld aktualisiert wird.

Wenn Sie die Tabelle erstellen von phpMyAdmin der Standardeinstellung wird die Zeitstempel aktualisieren , wenn eine Zeile Update passiert. Wenn Ihr Zeitstempel abgelegt wird nicht mit Zeilenaktualisierung aktualisieren, können Sie die folgende Abfrage verwenden, um einen Zeitstempel machen ein auto aktualisiert.

ALTER TABLE your_table
      MODIFY COLUMN ts_activity TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

Das Zeitstempel-Datentyp speichert Datum und Uhrzeit, aber im UTC-Format, nicht in dem aktuellen Zeitzone-Format als Datetime tut. Und wenn Sie Daten holen, Zeitstempel wandelt erneut, dass in der aktuellen Zeitzone Zeit.

So nehme an, Sie in den USA sind und Abrufen von Daten von einem Server, der eine Zeitzone von den USA. Dann werden Sie das Datum und die Zeit bekommen nach den USA Zeitzone. Der Zeitstempel Spalte vom Datentyp immer automatisch aktualisiert, wenn die entsprechende Zeile aktualisiert wird. So kann es sinnvoll sein, zu verfolgen, wenn eine bestimmte Zeile letztes Mal aktualisiert wurde.

Für weitere Informationen können Sie den Blog-Eintrag lesen Timestamp Vs Datetime .

Ich benutze immer einen Unix-Zeitstempel, einfach geistige Gesundheit zu halten, wenn mit vielen Datetime-Informationen zu tun, vor allem, wenn Anpassungen für Zeitzonen durchgeführt wird, das Hinzufügen / Subtrahieren Daten und dergleichen. Wenn Zeitstempel verglichen wird, schließt dies die Faktoren der Zeitzone zu verkomplizieren und ermöglicht es Ihnen, Ressourcen in der Server-Seite Verarbeitung zu ersparen (Ob Anwendungscode oder Datenbankabfragen sein), dass Sie die Verwendung von leichter Arithmetik machen eher dann schweres Datum Zeit addieren / subtrahieren Funktionen.

Eine andere Sache, eine Überlegung wert:

Wenn Sie eine Anwendung bauen, man kann nie wissen, wie Sie Ihre Daten könnten die Zeile verwendet werden müssen nach unten. Wenn Sie mit Wind bis zu, sagen wir, eine Reihe von Datensätzen in Ihrem Datensatz vergleichen, mit, sagen wir, eine Reihe von Artikeln aus einem Dritt API, und sagen, steckte sie in chronologischer Reihenfolge, werden Sie glücklich zu haben Unix-Zeitstempel für Ihre Zeilen. Selbst wenn Sie MySQL-Zeitstempel verwenden möchten, speichern Sie eine Unix-Zeitstempel als Versicherung.

Vorsicht vor Zeitstempel zu ändern, wenn Sie eine Update-Anweisung auf einem Tisch tun. Wenn Sie eine Tabelle mit Spalten 'Name' haben (varchar), 'Age' (int) und 'DATE_ADDED' (Zeitstempel) und führen Sie die folgende DML-Anweisung

UPDATE table
SET age = 30

dann würde jeder einzelne Wert in Ihrem DATE_ADDED 'Spalte auf den aktuellen Zeitstempel geändert werden.

Referenz von diesem Artikel getroffenen Maßnahmen:

Die wichtigsten Unterschiede:

TIMESTAMP verwendet Änderungen an Datensätzen zu verfolgen, und jedes Mal aktualisiert werden, wenn der Datensatz geändert wird. DATETIME- verwendet, um spezifische und statischen Wert zu speichern, die nicht durch Änderungen in Datensätzen betroffen ist.

TIMESTAMP auch durch unterschiedliche Zeitzonen-Einstellung betroffen. DATETIME- konstant ist.

TIMESTAMP intern umgewandelt aktuelle Zeitzone für die Lagerung zu UTC, und während des Abrufens umgewandelt zurück in der aktuellen Zeitzone. DATETIME- kann dies nicht tun.

TIMESTAMP unterstützt Bereich: ‚1970-01-01 00.00.01 'UTC‚2038.01.19 03.14.07' UTC DATETIME- unterstützt Bereich: ‚1000.01.01 00.00.00 'auf‚9999-12-31 23.59.59 "

In meinem Fall, habe ich UTC als Zeitzone für alles: das System, Datenbankserver usw. Jedes Mal, wenn ich kann. Wenn mein Kunde eine andere Zeitzone erfordert, dann konfiguriere ich es auf der App.

ich fast immer Zeitstempel lieber als Datetime-Felder, da die Zeitstempel die Zeitzone implizit enthalten. Also, seit dem Moment, dass die App wird von den Benutzern aus verschiedenen Zeitzonen zugegriffen werden, und Sie wollen, dass sie Daten und Zeiten in ihrer lokalen Zeitzone, um zu sehen, dieser Feldtyp macht es ziemlich einfach, es zu tun, als ob die Daten in Datetime-Feldern gespeichert wurden .

Als Plus im Fall einer Migration der Datenbank zu einem System mit einer anderen Zeitzone, würde ich fühle mich sicheren Zeitstempel verwendet wird. Um nicht zu sagen mögliche Probleme, wenn die Unterschiede zwischen zwei Momenten mit einer Verbraucherzeitänderung zwischen und um eine Genauigkeit von 1 Stunde Berechnung oder weniger.

Also, um zusammenzufassen, lege ich Wert auf diese Vorteile von Datenstand:

  • bereit, sich auf internationale (Multi-Zeitzone) verwenden Apps
  • einfache Migrationen zwischen den Zeitzonen
  • recht einfach diferences zu berechnen (nur beide Zeitstempel subtrahieren)
  • keine Sorge über Termine in / out eine Sommerzeit

Für all diesen Gründen wähle ich UTC & Zeitstempel Felder, in denen posible. Und ich vermeiden Kopfschmerzen;)

Der große Unterschied ist,

Blick auf diese Post sehen Probleme mit Datetime Indizierung

Ein weiterer Unterschied zwischen Zeitstempel und für Datum und Uhrzeit in Zeitstempel wird Sie nicht Wert auf NULL gesetzt werden.

fand ich unübertroffene Nützlichkeit in TIMESTAMP der Fähigkeit zur automatischen Aktualisierung selbst auf Basis die aktuelle Zeit ohne die Verwendung von unnötigen Trigger. Das ist nur durch mich, obwohl TIMESTAMP UTC ist, wie es gesagt wurde.

Es Spur über verschiedene Zeitzonen zu halten, so dass, wenn Sie eine relative Zeit zum Beispiel angezeigt werden, UTC-Zeit ist das, was Sie wollen.

ich lieber mit Zeitstempel so alles zu halten, in einem gemeinsamen Rohformat und formatiert die Daten in PHP-Code oder in der SQL-Abfrage. Es gibt Fälle, in denen es sich als nützlich in Ihrem Code kommt alles im normalen Sekunden zu halten.

+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
|                                       TIMESTAMP                                       |                                 DATETIME                                 |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
| TIMESTAMP requires 4 bytes.                                                           | DATETIME requires 8 bytes.                                               |
| Timestamp is the number of seconds that have elapsed since January 1, 1970 00:00 UTC. | DATETIME is a text displays 'YYYY-MM-DD HH:MM:SS' format.                |
| TIMESTAMP supported range: ‘1970-01-01 00:00:01′ UTC to ‘2038-01-19 03:14:07′ UTC.    | DATETIME supported range: ‘1000-01-01 00:00:00′ to ‘9999-12-31 23:59:59′ |
| TIMESTAMP during retrieval converted back to the current time zone.                   | DATETIME can not do this.                                                |
| TIMESTAMP is used mostly for metadata i.e. row created/modified and audit purpose.    | DATETIME is used mostly for user-data.                                   |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+

Ich mag einen Unix-timestamp, denn Sie können in zahlen umwandeln und nur sorgen über die Anzahl.Plus, Sie hinzufügen/subtrahieren und erhalten Laufzeiten, etc.Dann konvertieren Sie das Ergebnis der bisher in welcher Form auch immer.Dieser code findet heraus, wie viel Zeit in Minuten vergingen zwischen ein timestamp aus einem Dokument und die aktuelle Uhrzeit.

$date  = $item['pubdate']; (etc ...)
$unix_now = time();
$result = strtotime($date, $unix_now);
$unix_diff_min = (($unix_now  - $result) / 60);
$min = round($unix_diff_min);

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

TIMESTAMP ist nützlich, wenn Sie die Besucher aus verschiedenen Ländern mit unterschiedlichen Zeitzonen haben. Sie können ganz einfach den Zeitstempel in jedes Land Zeitzone konvertieren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top