W Ruby on Rails, jaka jest różnica między DateTime, Timestamp, Time I Date?

Z mojego doświadczenia wynika, że ustalenie daty / czasu jest właściwe, gdy programowanie jest zawsze obarczone niebezpieczeństwem i trudnościami.

Ruby i Rails zawsze mi w tym umykały, choćby ze względu na przytłaczającą liczbę opcji; nigdy nie mam pojęcia, które powinienem wybrać.

Kiedy używam Rails i patrzę na typy danych ActiveRecord, mogę znaleźć następujące

: datetime,: timestamp,: time, and: date

I nie mam pojęcia jakie są różnice są albo gdzie czają się gotchas.

Co za różnica? Do czego ich używasz?

(P. S. używam Rails3)

Author: Arslan Ali, 2010-10-13

3 answers

Różnica między różnymi formatami daty/czasu w ActiveRecord ma niewiele wspólnego z Rails i wszystko ma związek z dowolną bazą danych, której używasz.

Używając MySQL jako przykładu (jeśli nie z innego powodu, bo jest najbardziej popularny), masz DATE, DATETIME, TIME i TIMESTAMP typy danych kolumn; tak jak masz CHAR, VARCHAR, FLOAT i INTEGER.

Więc pytasz, co za różnica? Niektóre z nich są oczywiste. DATE przechowuje tylko datę, TIME przechowuje tylko czas dnia, podczas gdy DATETIME przechowuje oba.

Różnica pomiędzy DATETIME i TIMESTAMP jest nieco bardziej subtelna: DATETIME jest sformatowana jako YYYY-MM-DD HH:MM:SS. Ważne zakresy idą od roku 1000 do roku 9999 (i wszystko pomiędzy. While TIMESTAMP wygląda podobnie, gdy pobierasz go z bazy danych, jest to naprawdę tylko front dla znacznika czasu Uniksa . Jego obowiązujący zakres sięga od 1970 do 2038 roku. Różnica tutaj, poza różnymi wbudowanymi funkcjami w silniku bazy danych, polega na przechowywaniu miejsce. Ponieważ DATETIME przechowuje każdą cyfrę w roku, miesiącu, dniu, godzinie, minucie i sekundzie, zużywa łącznie 8 bajtów. Ponieważ TIMESTAMP przechowuje tylko liczbę sekund od 1970-01-01, używa 4 bajtów.

Możesz przeczytać więcej o różnicach między formatami czasu w MySQL tutaj .

W końcu, sprowadza się do tego, co trzeba kolumny Data / Czas zrobić. Czy musisz przechowywać daty i godziny przed 1970 lub po 2038? Użyj DATETIME. Czy musisz się martwić o bazę danych rozmiar i jesteś w tym czasie? Użyj TIMESTAMP. Czy musisz tylko przechowywać datę? Użyj DATE. Czy musisz tylko przechowywać czas? Użyj TIME.

Po tym wszystkim Rails podejmuje niektóre z tych decyzji za Ciebie. Zarówno :timestamp, jak i :datetime domyślnie będą to DATETIME, podczas gdy :date i :time odpowiadają odpowiednio DATE i TIME.

Oznacza to, że w Rails musisz tylko zdecydować, czy chcesz przechowywać datę, godzinę czy obie te rzeczy.

 586
Author: vonconrad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-13 18:33:33
  1. :datetime (8 bajtów)

    • przechowuje datę i czas w formacie YYYY-MM-DD HH: MM: SS
    • przydatne dla kolumn takich jak birth_date
  2. : timestamp (4 bajty)

    • przechowuje ilość sekund od 1970-01-01
    • przydatne dla kolumn takich jak updated_at, created_at
  3. : date (3 bajty)
    • Data Przechowywania
  4. : time (3 bajty)
    • Przechowuje Czas
 25
Author: mingca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-13 03:13:42

Oto niesamowite i dokładne Wyjaśnienie, które znalazłem.

Znacznik czasu używany do śledzenia zmian rekordów i aktualizacji za każdym razem, gdy rekord został zmieniony. DATETIME używany do przechowywania specyficznych i statycznych wartość, na którą nie mają wpływu żadne zmiany w rekordach.

Znacznik czasu ma również wpływ na różne ustawienia związane ze strefą czasową. DATETIME jest stała.

Znacznik czasu wewnętrznie konwertuje bieżącą strefę czasową na UTC do przechowywania, i podczas pobierania konwertować z powrotem do aktualna Strefa czasowa. DATETIME nie może tego zrobić.

TIMESTAMP to 4 bajty, A DATETIME to 8 bajtów.

Timestamp obsługiwany zakres: '1970-01-01 00:00: 01' UTC do '2038-01-19 03: 14: 07 'UTC DateTime obsługiwany zakres:' 1000-01-01 00: 00: 00 ' do ‘9999-12-31 23:59:59′

Źródło: https://www.dbrnd.com/2015/09/difference-between-datetime-and-timestamp-in-mysql/#:~:text=DATETIME%20vs%20TIMESTAMP%3A,DATETIME%20is%20constant.

Również...

Tabela z różne typy kolumn "date" i odpowiadające im typy migracji rails w zależności od bazy danych

 1
Author: Stanislav Modrák,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55