ändern - php mysql datum formatieren




Soll ich den Datentyp datetime oder timestamp in MySQL verwenden? (20)

2016 + : Ich empfehle Ihnen, Ihre Mysql-Zeitzone auf UTC einzustellen und DATETIME zu verwenden:

Jedes neuere Front-End-Framework (Angular 1/2, React, Vue, ...) kann Ihre UTC-Datumszeit einfach und automatisch in Ortszeit konvertieren.

Zusätzlich:

(Es sei denn, Sie ändern wahrscheinlich die Zeitzone Ihrer Server.)

Beispiel mit AngularJs

// back-end: format for angular within the sql query
SELECT DATE_FORMAT(my_datetime, "%Y-%m-%dT%TZ")...

// font-end Output the localised time
{{item.my_datetime | date :'medium' }}

Das lokalisierte Zeitformat ist hier verfügbar: https://docs.angularjs.org/api/ng/filter/date

Würden Sie die Verwendung eines datetime oder eines datetime empfehlen und warum (mit MySQL)?

Ich arbeite mit PHP auf der Serverseite.


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

  2. Zeitstempel sind auch in der Datenbank leichter und werden schneller indiziert.

  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 TIMESTAMP-Datentyp 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.

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

Der Hauptunterschied besteht darin, dass DATETIME konstant ist, während TIMESTAMP von der Einstellung von time_zone .

Es ist also nur von Bedeutung, wenn Sie Cluster über Zeitzonen hinweg synchronisiert haben oder in Zukunft möglicherweise synchronisiert haben.

Einfacher ausgedrückt: Wenn ich eine Datenbank in Australien habe und einen Abzug dieser Datenbank zum Synchronisieren / Auffüllen einer Datenbank in Amerika mache, würde TIMESTAMP aktualisiert werden, um die tatsächliche Zeit des Ereignisses in der neuen Zeitzone wiederzugeben, während DATETIME dies tun würde spiegeln immer noch den Zeitpunkt des Ereignisses in der au-Zeitzone wider .

Ein hervorragendes Beispiel für die Verwendung von DATETIME, bei der TIMESTAMP hätte verwendet werden sollen, ist bei Facebook, wo die Server nie ganz sicher sind, wie viel Zeit zwischen Zeitzonen passiert. Einmal hatte ich ein Gespräch, in dem die Zeit darauf ankam, auf Nachrichten zu antworten, bevor die Nachricht tatsächlich gesendet wurde. (Dies könnte natürlich auch durch eine schlechte Zeitzonenübersetzung in der Messagingsoftware verursacht worden sein, wenn die Zeiten gebucht und nicht synchronisiert wurden.)



Die folgenden Beispiele zeigen, wie der TIMESTAMP die Werte geändert hat, nachdem die time-zone to 'america/new_york' wobei DATETIME unverändert DATETIME .

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 Menschen diese nützlichen Datentypen MySQL: Datetime versus Timestamp finden können .


Ein timestamp ist ein Sonderfall des datetime . Sie können timestamp erstellen, um spezielle Eigenschaften zu erhalten. Es kann so eingestellt werden, dass es sich beim Erstellen und / oder Aktualisieren selbst aktualisiert.

In Bezug auf "größere" Datenbanken hat timestamp einige Sonderauslöser.

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


Es ist erwähnenswert, dass Sie in MySQL beim Erstellen Ihrer Tabellenspalten Folgendes verwenden können:

on update CURRENT_TIMESTAMP

Dadurch wird die Zeit bei jeder Instanz, an der Sie eine Zeile ändern, aktualisiert. Dies ist manchmal für gespeicherte Informationen zur letzten Bearbeitung sehr hilfreich. Dies funktioniert nur mit Zeitstempel, nicht jedoch mit Datumszeit.


Hängt wirklich von der Anwendung ab.

Legen Sie für einen Termin in Sanghai einen Zeitstempel eines Benutzers auf einem Server in New York fest. Wenn der Benutzer nun eine Verbindung in Sanghai herstellt, greift er von einem gespiegelten Server in Tokio auf denselben Terminstempel zu. Er wird den Termin in Tokio Zeit sehen, versetzt von der ursprünglichen New Yorker Zeit.

Daher ist datetime für Werte, die die Benutzerzeit wie einen Termin oder einen Zeitplan darstellen, besser. Damit kann der Benutzer unabhängig von den Servereinstellungen genau das gewünschte Datum und die gewünschte Uhrzeit einstellen. Die festgelegte Zeit ist die festgelegte Zeit, die nicht durch die Zeitzone des Servers, die Zeitzone des Benutzers oder durch Änderungen bei der Berechnung der Sommerzeit beeinflusst wird (ja, es ändert sich).

Andererseits verwenden Sie für Werte, die die Systemzeit darstellen, wie Zahlungstransaktionen, Tabellenänderungen oder Protokollierung, immer Zeitstempel. Das System wird nicht durch Verschieben des Servers in eine andere Zeitzone oder durch Vergleiche zwischen Servern in unterschiedlichen Zeitzonen beeinträchtigt.

Zeitstempel sind auch in der Datenbank leichter und werden schneller indiziert.


Ich treffe diese Entscheidung auf einer semantischen 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 stattfand.

Ich verwende ein datetime-Feld, wenn das Datum und die Uhrzeit beliebig eingestellt und geändert werden können. Zum Beispiel, wenn ein Benutzer später Änderungsänderungen speichern kann.


Ich verwende DATETIME-Felder immer für etwas anderes als Zeilenmetadaten (Erstellungsdatum oder Änderungsdatum).

Wie in der MySQL-Dokumentation erwähnt:

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 liegt zwischen '1000-01-01 00:00:00' und '9999-12-31 23:59:59'.

...

Der TIMESTAMP-Datentyp 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.

Es ist sehr wahrscheinlich, dass Sie die untere Grenze für TIMESTAMPs im allgemeinen Gebrauch erreichen - z. B. das Speichern des Geburtsdatums.


Ich würde immer einen Unix-Zeitstempel verwenden, wenn ich mit MySQL und PHP arbeite. Der Hauptgrund dafür ist die Standardmethode in PHP, die einen Zeitstempel als Parameter verwendet, sodass keine Analyse erforderlich ist.

Um den aktuellen Unix-Zeitstempel in PHP abzurufen, führen Sie einfach time();
und in MySQL SELECT UNIX_TIMESTAMP(); .


In MySQL 5 und höher werden TIMESTAMP- Werte zur Speicherung von der aktuellen Zeitzone in UTC und von UTC in die aktuelle Zeitzone zum Abruf 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 Uhrzeit des Servers. Die Zeitzone kann pro Verbindung festgelegt werden, wie in MySQL Server Time Zone Support beschrieben .


TIMESTAMP ist immer in UTC (dh seit 1970-01-01 in UTC verstrichene Sekunden) und wird von Ihrem MySQL-Server automatisch in das Datum / die Uhrzeit für die Server-Zeitzone konvertiert. Langfristig ist TIMESTAMP der richtige Weg, weil Sie wissen, dass Ihre Zeitdaten immer in UTC vorliegen. Zum Beispiel werden Sie Ihre Daten nicht vermasseln, wenn Sie zu einem anderen Server migrieren oder die Zeitzoneneinstellungen auf Ihrem Server ändern.


Vergleich zwischen DATETIME, TIMESTAMP und DATE

Was ist das?

  • Ein DATETIME- oder TIMESTAMP-Wert kann einen nachlaufenden Sekundenbruchteil mit einer Genauigkeit von bis zu Mikrosekunden (6 Stellen) enthalten. Insbesondere wird ein Bruchteil in einem Wert, der in eine DATETIME- oder TIMESTAMP-Spalte eingefügt wird, gespeichert und nicht verworfen. Dies ist natürlich optional.

Quellen:


Zeitstempel in MySQL werden im Allgemeinen zur Nachverfolgung von Änderungen an Datensätzen verwendet und häufig bei jeder Änderung des Datensatzes aktualisiert. Wenn Sie einen bestimmten Wert speichern möchten, sollten Sie ein Datumsfeld verwenden.

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


Referenz aus diesem Artikel:

Die Hauptunterschiede:

TIMESTAMP dient zum Nachverfolgen von Änderungen an Datensätzen und zum Aktualisieren jedes Mal, wenn der Datensatz geändert wird. DATETIME wird zum Speichern bestimmter und statischer Werte verwendet, die nicht von Änderungen in Datensätzen betroffen sind.

TIMESTAMP ist auch von verschiedenen Einstellungen bezüglich TIME ZONE betroffen. DATETIME ist konstant.

TIMESTAMP konvertierte intern die aktuelle Zeitzone zum Speichern in UTC und während des Abrufs in die aktuelle Zeitzone zurück. DATETIME kann das nicht.

Unterstützter Bereich für TIMESTAMP: '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 ′


Ich bevorzuge Zeitstempel, 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 einfachen Sekunden zu halten.


Ich habe eine unübertroffene Nützlichkeit in der Fähigkeit von TIMESTAMP gefunden, sich anhand der aktuellen Zeit automatisch zu aktualisieren, ohne unnötige Auslöser zu verwenden. Das ist nur ich, obwohl TIMESTAMP UTC ist, wie es gesagt wurde.

Es kann verschiedene Zeitzonen nachverfolgen. Wenn Sie beispielsweise eine relative Zeit anzeigen möchten, ist UTC-Zeit genau das, was Sie möchten.


Ich verwende BIGINTbeim Speichern von UTC lediglich unsigniert ...

was dann noch in PHP an die lokale Zeit angepasst werden kann.

die DATETIMEmit ausgewählt werden FROM_UNIXTIME( integer_timestamp_column ).

man sollte offensichtlich einen Index für diese Spalte setzen, sonst würde es keinen Fortschritt geben.


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 sie in der App.

Ich bevorzuge fast immer Zeitstempel anstelle von Datums- und Uhrzeitfeldern, da Zeitstempel implizit die Zeitzone enthalten. Seit dem Zeitpunkt, zu dem auf die App von Benutzern aus verschiedenen Zeitzonen zugegriffen wird und Sie möchten, dass ihnen Datum und Uhrzeit in ihrer lokalen Zeitzone angezeigt werden, macht es dieser Feldtyp ziemlich einfach, dies zu tun, als wenn die Daten in datetime-Feldern gespeichert wären .

Bei einer Migration der Datenbank zu einem System mit einer anderen Zeitzone würde ich mich bei der Verwendung von Zeitstempeln sicherer fühlen. Ganz zu schweigen von möglichen Problemen bei der Berechnung von Differenzen zwischen zwei Momenten, zwischen denen sich die Sommerzeit ändert, und die eine Genauigkeit von 1 Stunde oder weniger erfordern.

Zusammenfassend schätze ich diese Vorteile des Zeitstempels:

  • einsatzbereit für internationale (multi time zone) apps
  • einfache Migrationen zwischen Zeitzonen
  • recht einfach, Unterschiede zu berechnen (einfach beide Zeitmarken abziehen)
  • Keine Sorge über Datumsangaben in einer Sommerzeit

Aus all diesen Gründen wähle ich, wo möglich, UTC- und Zeitstempelfelder. Und ich vermeide Kopfschmerzen;)





sqldatatypes