Różnica pomiędzy różnymi formatami data/czas w ActiveRecord mają niewiele wspólnego z Rails i wszystko, co zrobić z bazy danych używasz.
Korzystanie z MySQL jako przykład (jeśli nie z innego powodu, ponieważ jest to najbardziej popularny), masz DATE
, DATETIME
, TIME
i TIMESTAMP
typy danych kolumna; jak masz CHAR
, VARCHAR
, FLOAT
i INTEGER
.
Tak, pytasz, co to za różnica? Cóż, niektóre z nich są oczywiste. DATE
tylko przechowuje datę TIME
tylko przechowuje porze dnia, podczas DATETIME
sklepach obu.
Różnica między DATETIME
a TIMESTAMP
jest nieco bardziej subtelna: DATETIME
jest sformatowana jako YYYY-MM-DD HH:MM:SS
. Prawidłowe zakresy zaczynają się od roku 1000 do roku 9999 (i wszystkiego pomiędzy. Podczas gdy TIMESTAMP
wygląda podobnie do po pobraniu z bazy danych, jest to po prostu przód dla unix timestamp. Jego poprawny zakres obejmuje okres od 1970 do 2038. różnica tutaj, oprócz różnych funkcji wbudowanych w silniku bazy danych, jest przestrzeń do przechowywania. Ponieważ DATETIME
sklepach każda cyfra w rok, miesiąc i dzień, godzina, minuta i sekunda, używa się w sumie 8 bajtów. Jak TIMESTAMP
tylko przechowuje liczbę sekund od 1970-01-01, używa 4 bajty.
można przeczytać więcej na temat różnic między formatami czasu w MySQL here.
W końcu sprowadza się to do tego, do czego potrzebujesz swojej kolumny daty/czasu. Czy chcesz przechowywać daty i godziny przed 1970 lub po 2038? Użyj DATETIME
. Czy musisz martwić się wielkością bazy danych i jesteś w tym pomiarze czasu? Użyj TIMESTAMP
. Czy potrzebujesz tylko przechowywać datę? Użyj DATE
. Czy potrzebujesz tylko przechowywać czas? Użyj TIME
.
Powiedziawszy to wszystko, Rails faktycznie podejmuje niektóre z tych decyzji dla ciebie. Zarówno :timestamp
, jak i będą domyślnie DATETIME
, podczas gdy :date
i :time
odpowiadają odpowiednio DATE
i TIME
.
Oznacza to, że w Railsach musisz zdecydować, czy chcesz przechowywać datę, czas, czy jedno i drugie.
Dla rekordu preferuję bezwzględne znaczniki czasu (unix), ponieważ format RRRR-MM-DD zależy od zastosowanej strefy czasowej. Klient musi znać strefę czasową serwera i musi wykonywać konwersje. Sekundy od 1970 r. Absolutne znaczniki czasu nie mają tego problemu. – n13
@ n13 Dobrze, ale nie jest to problem w Railsach, ponieważ przekształca się w UTC przed wstawieniem do bazy danych datetimes. – vonconrad
Jest to jeden z najbardziej pomocnych postów w uniwersum Rails. To powinno być dodane do przewodnika po prowadnicach ... – Andrew