Was ist in Ruby on Rails der Unterschied zwischen DateTime, Timestamp, Time und Date?

413

Nach meiner Erfahrung ist es immer mit Gefahren und Schwierigkeiten verbunden, die richtigen Daten und Zeiten für die Programmierung festzulegen.

Ruby und Rails sind mir in diesem Fall immer entgangen, schon allein wegen der überwältigenden Anzahl von Optionen. Ich habe nie eine Idee, die ich auswählen sollte.

Wenn ich Rails verwende und ActiveRecord-Datentypen betrachte, kann ich Folgendes finden

: datetime ,: timestamp ,: time und: date

und habe keine Ahnung, was die Unterschiede sind oder wo die Fallstricke lauern.

Was ist der Unterschied? Wofür benutzt du sie?

(PS Ich benutze Rails3)

Nick May
quelle

Antworten:

571

Der Unterschied zwischen verschiedenen Datums- / Uhrzeitformaten in ActiveRecord hat wenig mit Rails zu tun und alles mit der von Ihnen verwendeten Datenbank.

Mit MySQL als ein Beispiel (wenn aus keinem anderen Grund , weil es beliebteste), haben Sie DATE, DATETIME, TIMEund TIMESTAMPSpaltendatentypen; so wie Sie haben CHAR, VARCHAR, FLOATund INTEGER.

Sie fragen sich also, was ist der Unterschied? Nun, einige von ihnen sind selbsterklärend. DATEspeichert nur ein Datum, TIMEspeichert nur eine Tageszeit, während DATETIMEbeide gespeichert werden.

Der Unterschied zwischen DATETIMEund TIMESTAMPist etwas subtiler: DATETIMEist formatiert als YYYY-MM-DD HH:MM:SS. Gültige Bereiche reichen vom Jahr 1000 bis zum Jahr 9999 (und alles dazwischen. Während es beim Abrufen aus der Datenbank ähnlich TIMESTAMP aussieht , ist es wirklich nur eine Front für einen Unix-Zeitstempel . Der gültige Bereich reicht von 1970 bis 2038. Der Unterschied Abgesehen von den verschiedenen integrierten Funktionen in der Datenbank-Engine ist hier Speicherplatz vorhanden. Da DATETIMEjede Ziffer in Jahr, Monat, Tag, Stunde, Minute und Sekunde gespeichert wird, werden insgesamt 8 Byte verbraucht. Da TIMESTAMPnur die Nummer gespeichert wird von Sekunden seit dem 01.01.1970 werden 4 Bytes verwendet.

Weitere Informationen zu den Unterschieden zwischen Zeitformaten in MySQL finden Sie hier .

Am Ende kommt es darauf an, wozu Sie Ihre Datums- / Zeitspalte benötigen. Müssen Sie Daten und Zeiten vor 1970 oder nach 2038 speichern? Verwenden Sie DATETIME. Müssen Sie sich Gedanken über die Datenbankgröße machen und befinden sich innerhalb dieses Zeitbereichs? Verwenden Sie TIMESTAMP. Müssen Sie nur ein Datum speichern? Verwenden Sie DATE. Müssen Sie nur eine Zeit speichern? Verwenden Sie TIME.

Nach alledem trifft Rails tatsächlich einige dieser Entscheidungen für Sie . Sowohl :timestampund :datetimewird standardmäßig zu DATETIME, während :dateund :timeentspricht DATEund TIMEjeweils.

Dies bedeutet, dass Sie innerhalb von Rails nur entscheiden müssen, ob Sie Datum, Uhrzeit oder beides speichern müssen.

vonconrad
quelle
7
Für die Aufzeichnung bevorzuge ich absolute Zeitstempel (Unix), da das Format JJJJ-MM-TT von der verwendeten Zeitzone abhängt. Der Client muss also die Zeitzone des Servers kennen und Konvertierungen durchführen. Absolute Zeitstempel von Sekunden seit 1970 haben dieses Problem nicht.
n13
32
@ n13 Guter Punkt, aber kein wirkliches Problem in Rails, da es vor dem Einfügen von Datums- und Uhrzeitangaben in die Datenbank in UTC konvertiert wird.
vonconrad
13
Dies ist einer der hilfreichsten Beiträge im Rails-Universum. Dies sollte der Schienenführung hinzugefügt werden ...
Andrew
4
Die TIMESpalte von MySQL ist nicht unbedingt eine "Tageszeit", da sie Stunden> 24 akzeptiert. Es kann auch als "verstrichene Zeit" verwendet werden.
Nickgrim
6
Ist das bei anderen dbs auch so? zB Postgres?
Andy Hayden
23
  1. : datetime (8 Bytes)

    • Speichert Datum und Uhrzeit im Format JJJJ-MM-TT HH: MM: SS
    • Nützlich für Spalten wie Geburtsdatum
  2. : Zeitstempel (4 Bytes)

    • Speichert die Anzahl der Sekunden seit dem 01.01.1970
    • Nützlich für Spalten wie update_at, created_at
  3. : Datum (3 Bytes)
    • Speichert Datum
  4. : Zeit (3 Bytes)
    • Speichert Zeit
Mingca
quelle
3
Dies ist eher wie die TL: DR-Version der oben akzeptierten Antwort
Chidozie Nnachor
0

Hier ist eine großartige und präzise Erklärung, die ich gefunden habe.

TIMESTAMP wird verwendet, um Änderungen von 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 intern eine aktuelle Zeitzone zur Speicherung in UTC und konvertierte während des Abrufs die Zurück in die aktuelle Zeitzone. DATETIME kann das nicht.

TIMESTAMP ist 4 Bytes und DATETIME ist 8 Bytes.

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: https://www.dbrnd.com/2015/09/difference-between-datetime-and-timestamp-in-mysql/#:~:text=DATETIME%20vs%20TIMESTAMP%3A,DATETIME%20is%20constant .

Ebenfalls...

Tabelle mit unterschiedlichen Spalten- "Datumstypen" und entsprechenden Rails-Migrationstypen, abhängig von der Datenbank

Stanislav Modrák
quelle