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

414

Z mojego doświadczenia wynika, że ​​właściwe ustalanie dat i godzin, gdy programowanie jest zawsze pełne niebezpieczeństw i trudności.

Ruby i Rails zawsze unikali mnie w tej sprawie, choćby z powodu przeważającej liczby opcji; Nigdy nie mam pomysłu, który powinienem wybrać.

Kiedy używam Railsów i przeglądam typy danych ActiveRecord, mogę znaleźć następujące informacje

: datetime,: timestamp,: time i: date

i nie mam pojęcia, jakie są różnice ani gdzie czają się gotcha.

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

(PS Używam Rails3)

Nick May
źródło

Odpowiedzi:

572

Różnica między różnymi formatami daty i godziny w ActiveRecord ma niewiele wspólnego z Railsami i wszystko, co dotyczy bazy danych, której używasz.

Korzystanie z MySQL jako przykład (jeśli nie z innego powodu, ponieważ jest to najbardziej popularny), trzeba DATE, DATETIME, TIMEi TIMESTAMPtypy danych kolumna; tak jak trzeba CHAR, VARCHAR, FLOATi INTEGER.

Więc pytasz, jaka jest różnica? Cóż, niektóre z nich są oczywiste. DATEprzechowuje tylko datę, TIMEtylko pory dnia, a jednocześnie DATETIMEoba.

Różnica między DATETIMEi TIMESTAMPjest nieco bardziej subtelna: DATETIMEjest sformatowana jako YYYY-MM-DD HH:MM:SS. Prawidłowe zakresy zaczynają się od roku 1000 do roku 9999 (i wszystko pomiędzy. Podczas gdy TIMESTAMP wygląda podobnie podczas pobierania go z bazy danych, to tak naprawdę jest tylko frontem dla uniksowego znacznika czasu . Jego prawidłowy zakres wynosi od 1970 do 2038 roku. Różnica tutaj, oprócz różnych wbudowanych funkcji w silniku bazy danych, jest miejsce do przechowywania. Ponieważ DATETIMEprzechowuje każdą cyfrę w roku, miesiącu dzień, godzinę, minutę i sekundę, zużywa łącznie 8 bajtów. Jak TIMESTAMPtylko przechowuje 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 .

Ostatecznie wszystko sprowadza się do tego, czego potrzebujesz do wykonania kolumny z datą / godziną. Czy chcesz przechowywać daty i godziny przed 1970 r. Lub po 2038 r.? Zastosowanie DATETIME. Czy musisz się martwić o rozmiar bazy danych i mieścisz się w tym przedziale czasowym? Zastosowanie TIMESTAMP. Czy potrzebujesz tylko zapisać datę? Zastosowanie DATE. Potrzebujesz tylko czasu? Zastosowanie TIME.

Powiedziawszy to wszystko, Rails faktycznie podejmuje niektóre z tych decyzji za ciebie . Oba :timestampi :datetimebędą domyślnie ustawione na DATETIME, while :datei :timeodpowiednio na DATEi TIME.

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

vonconrad
źródło
7
Dla przypomnienia wolę bezwzględne znaczniki czasu (unix), ponieważ format RRRR-MM-DD zależy od zastosowanej strefy czasowej. Tak więc klient musi znać strefę czasową serwera i musi dokonywać konwersji. Absolutne znaczniki czasu od 1970 roku nie mają tego problemu.
n13
32
@ n13 Dobra uwaga, ale tak naprawdę nie jest to problem w Railsach, ponieważ konwertuje do UTC przed wstawieniem czasów danych do bazy danych.
vonconrad,
13
Jest to jeden z najbardziej pomocnych postów we wszechświecie Rails. Należy to dodać do przewodnika po torach ...
Andrew
4
TIMEKolumna MySQL nie jest ściśle „porą dnia”, ponieważ przyjmuje godziny> 24; jest również użyteczny jako „upływ czasu”.
nickgrim
6
Czy to samo w innych dbs? np. postgres?
Andy Hayden
24
  1. : datetime (8 bajtów)

    • Sklepy Data i godzina sformatowane RRRR-MM-DD GG: MM: SS
    • Przydatne w przypadku kolumn takich jak data urodzenia
  2. : timestamp (4 bajty)

    • Przechowuje liczbę sekund od 1970-01-01
    • Przydatny w przypadku kolumn takich jak updated_at, Created_at
  3. : data (3 bajty)
    • Data sklepu
  4. : czas (3 bajty)
    • Przechowuje czas
Mingca
źródło
3
To bardziej przypomina powyższą wersję TL: DR
Chidozie Nnachor,
0

Oto niesamowite i precyzyjne wyjaśnienie, które znalazłem.

TIMESTAMP służy do śledzenia zmian rekordów i aktualizuje się za każdym razem, gdy rekord jest zmieniany. DATETIME służy do przechowywania określonej i statycznej wartości, na którą nie mają wpływu żadne zmiany w rekordach.

TIMESTAMP ma również wpływ na inne ustawienia związane ze STREFA CZASU. DATETIME jest stały.

TIMESTAMP wewnętrznie przekonwertował bieżącą strefę czasową na UTC w celu przechowywania, a podczas wyszukiwania konwertuje z powrotem na bieżącą strefę czasową. DATETIME nie może tego zrobić.

TIMESTAMP ma 4 bajty, a DATETIME ma 8 bajtów.

Obsługiwany zakres TIMESTAMP: „1970-01-01 00:00:01 ′ UTC do '2038-01-19 03:14:07 ′ Obsługiwany zakres UTC DATETIME:„ 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óżnymi typami kolumn „data” i odpowiadającymi im typami migracji szyn w zależności od bazy danych

Stanislav Modrák
źródło