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)
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
.
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
.
: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.
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
-
:datetime (8 bajtów)
- przechowuje datę i czas w formacie YYYY-MM-DD HH: MM: SS
- przydatne dla kolumn takich jak birth_date
-
: timestamp (4 bajty)
- przechowuje ilość sekund od 1970-01-01
- przydatne dla kolumn takich jak updated_at, created_at
- : date (3 bajty)
- Data Przechowywania
- : time (3 bajty)
- Przechowuje Czas
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ównież...
Tabela z różne typy kolumn "date" i odpowiadające im typy migracji rails w zależności od bazy danych
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