2010-10-13 6 views
364

Z mojego doświadczenia wynika, coraz dat/razy w prawo, gdy programowanie jest zawsze obarczona zagrożenia i difficulity.W Ruby on Rails, jaka jest różnica między DateTime, Timestamp, Time and Date?

Ruby i Rails zawsze wymykał mi na ten jeden, choćby ze względu na ogromną liczbę opcji; Nigdy nie mam pojęcia, które powinienem wybrać.

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

: DateTime: znacznik czasu,: czas, oraz: data

i nie mają pojęcia, co różnice są lub gdzie czają się goniec.

Jaka jest różnica? Do czego ich używasz?

(PS: Używam Rails3)

Odpowiedz

508

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 TIMESTAMPwyglą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.

+6

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

+27

@ n13 Dobrze, ale nie jest to problem w Railsach, ponieważ przekształca się w UTC przed wstawieniem do bazy danych datetimes. – vonconrad

+9

Jest to jeden z najbardziej pomocnych postów w uniwersum Rails. To powinno być dodane do przewodnika po prowadnicach ... – Andrew

1
  1. : datetime (8 bajtów)

    • Stores Data i sformatowana Czas YYYY-MM-DD HH: MM: SS
    • Przydatne dla kolumn jak birth_date
  2. : znacznik czasu (4 bajty)

    • Sklepy numbe R sekund od 1970-01-01
    • Przydatne dla kolumn jak updated_at, created_at
  3. : data (3 bajty)
    • Stores data
  4. : czas (3 bajty)
    • Stores Czas
Powiązane problemy