Tak. Istnieją przypadki użycia dla TIMESTAMP WITHOUT TIME ZONE
.
- W typowych aplikacjach biznesowych tego typu można używać tylko do:
- Rezerwacja przyszłych spotkań
- Reprezentujący tę samą porę dnia w różnych strefach czasowych, takich jak południe w 23 dniu w Tokio i Paryżu (dwie różne godziny w odstępie godzin, ta sama pora dnia)
- Aby śledzić momenty, zawsze używaj określonych punktów na osi czasu
TIMESTAMP WITH TIME ZONE
, a nie WITHOUT
.
TIMESTAMP WITHOUT TIME ZONE
wartości nie są punktem na osi czasu, a nie faktycznymi momentami. Przedstawiają przybliżone wyobrażenie o potencjalnych momentach, możliwych punktach na osi czasu w zakresie około 26-27 godzin (zakres stref czasowych na całym świecie). Nie mają one żadnego rzeczywistego znaczenia, dopóki nie zastosujesz strefy czasowej lub nie uwzględnisz UTC .
Np .: Boże Narodzenie
Na przykład powiedz, że musisz zarejestrować początek wakacji / dni świętych.
Table: holiday_
Column: year_ Type: SMALLINT
Column: description_ Type: VARCHAR
Column: start_ Type: TIMESTAMP WITHOUT TIME ZONE
Aby odnotować fakt, że Boże Narodzenie rozpoczyna się po północy 25 grudnia tego roku, musimy powiedzieć 2016-12-25 00:00:00
bez żadnej strefy czasowej. Na początku Świętego Mikołaja odwiedza Auckland NZ tuż po północy, ponieważ jest to jedna z najwcześniejszych północy na świecie. Potem idzie w kierunku zachodnim, gdy nadejdzie kolejna północ, wkrótce docierając do Filipin. Następnie renifery idą w kierunku zachodnim, docierając do Indii o północy, co zdarza się kilka godzin po tej północy w Auckland. Znacznie później jest jeszcze północ w Paryżu FR, a jeszcze później północ w Montrealu CA. Wszystkie te wizyty Świętego Mikołaja zdarzają się w różnych momentach , jednak wszystkie odbywają się wkrótce po północy, o północy każdej miejscowości.
Nagrywanie 2016-12-25 00:00:00
bez żadnej strefy czasowej jako początku świąt Bożego Narodzenia jest pouczające i zgodne z prawem, ale tylko niejasno. Dopóki nie powiesz „Boże Narodzenie w Auckland” lub „Boże Narodzenie w Montrealu”, nie mamy określonego momentu. Jeśli rejestrujesz faktyczny moment za każdym razem, gdy sanie lądują, użyj TIMESTAMP WITH TIME ZONE
raczej niż WITHOUT
typu.
Podobnie jak Boże Narodzenie jest Sylwester. Kiedy piłka Times Square spada w Nowym Jorku , ludzie w Seattle nadal chłodzą szampana i przygotowują imprezowe rogi . Nagrywalibyśmy jednak ideę noworocznego momentu jak 2017-01-01 00:00:00
w TIMESTAMP WITHOUT TIME ZONE
. W przeciwieństwie do tego, jeśli chcemy nagrywać, kiedy piłka spadła w Nowym Jorku lub gdy mieszkańcy Seattle rozwalili rogi, zamiast tego użylibyśmy TIMESTAMP WITH TIME ZONE
(nie WITHOUT
) nagrania tych faktycznych chwil, co trzy godziny od siebie.
Np .: Zmiany fabryczne
Innym przykładem może być rejestrowanie polityki, która obejmuje czas naścienny w różnych lokalizacjach. Załóżmy, że mamy fabryki w Detroit, Düsseldorfie i Delhi. Jeśli powiemy, że we wszystkich trzech fabrykach pierwsza zmiana zaczyna się o 6 rano z przerwą na lunch o 11:30, którą można zapisać jako TIMESTAMP WITHOUT TIME ZONE
. Ponownie, ta informacja jest użyteczna w sposób niejasny, ale nie wskazuje określonego momentu w czasie, dopóki nie zastosujemy strefy czasowej. Na wschodzie zaczyna się nowy dzień. Tak więc fabryka w Delhi zostanie otwarta jako pierwsza o szóstej rano. Kilka godzin później fabryka w Düsseldorfie rozpoczyna pracę o 6 rano. Ale fabryka w Detroit otworzy się dopiero po sześciu godzinach, kiedy nastąpi 6 rano.
Porównaj ten pomysł (kiedy zazwyczaj zaczyna się zmiana fabryki) z faktem historycznym, kiedy każdy pracownik fabryki zarejestrował się, aby rozpocząć zmianę w danym dniu. Wejście w to prawdziwy moment, rzeczywisty punkt na osi czasu. Nagrywalibyśmy to w kolumnie typu, TIMESTAMP WITH TIME ZONE
a nie WITHOUT
typu.
Tak, istnieją uzasadnione przypadki użycia TIMESTAMP WITHOUT TIME ZONE
. Ale z mojego doświadczenia z aplikacjami biznesowymi są stosunkowo rzadkie. W biznesie zależy nam na faktycznych momentach: kiedy faktura rzeczywiście dotarła, kiedy dokładnie umowa wchodzi w życie, w którym momencie wykonano tę transakcję bankową. Więc w takich typowych sytuacjach chcemy tego TIMESTAMP WITH TIME ZONE
typu.
Aby uzyskać więcej dyskusji, zobacz moją odpowiedź na podobne pytanie, czy powinienem przechowywać znaczniki czasu UTC lub czas lokalny dla zmian
Postgres
Pamiętaj, że Postgres nigdy nie zapisuje informacji o strefie czasowej określonych podczas wstawiania znacznika czasu.
TIMESTAMP WITH TIME ZONE
- Każda określona strefa czasowa lub przesunięcie zawarte w danych wejściowych służy do dostosowania wartości do UTC i zapisania. Informacje o strefie / przesunięciu są następnie odrzucane. Pomyśl
TIMESTAMP WITH TIME ZONE
jak TIMESTAMP WITH RESPECT FOR TIME ZONE
.
- Wejście o 12:00 w dniu 7 marca tego roku w Indiach zostanie dostosowana do godziny UTC poprzez odjęcie pięciu i pół godziny: 6:30 rano.
TIMESTAMP WITHOUT TIME ZONE
- Każda określona strefa czasowa lub przesunięcie zawarte w danych wejściowych jest całkowicie ignorowane.
- Dane wejściowe o godzinie 12:00 w dniu 7 marca tego roku w Indiach są rejestrowane jako 12:00 w dniu 7 marca tego roku bez żadnych korekt.
Standard SQL ledwo dotyka kwestii typów danych i zachowania w czasie. Baza danych różni się więc znacznie pod względem obsługi daty i godziny.