Pracuję nad projektem PostgreSQL DB i zastanawiam się, jak najlepiej przechowywać znaczniki czasu.
Założenia
Użytkownicy w różnych strefach czasowych będą korzystać z bazy danych dla wszystkich funkcji CRUD.
Przejrzałem 2 opcje:
timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')
bigint NOT NULL DEFAULT
Dla timestamp
chciałbym wysłać ciąg, który reprezentuje dokładną (UTC) znacznik czasu w tej chwili INSERT.
Dla bigint
chciałbym przechowywać dokładnie to samo, ale w formacie liczbowym. (problemy ze strefą czasową są obsługiwane przed przekazaniem millis na serwer, więc zawsze millis w UTC).
Jedną z głównych zalet przechowywania a bigint
może być to, że łatwiej byłoby przechowywać i odzyskiwać, ponieważ przekazywanie poprawnie sformatowanego znacznika czasu jest bardziej złożone niż zwykła liczba (milis od czasu wydania Uniksa).
Moje pytanie brzmi, które pozwoliłoby na najbardziej elastyczny projekt i jakie byłyby pułapki każdego podejścia.
Odpowiedzi:
Przechowuj znaczniki czasu jako
timestamp
, a raczejtimestamptz
(timestamp with time zone
), ponieważ masz do czynienia z wieloma strefami czasowymi . Wymusza to prawidłowe dane i zazwyczaj jest najbardziej wydajne. Pamiętaj, aby zrozumieć typ danych, istnieją pewne nieporozumienia wokół:Aby rozwiązać problem:
Możesz przekazać i pobrać epokę UNIX w dowolny sposób, jeśli wolisz:
Związane z:
Jeśli chcesz zapisać bieżący znacznik czasu z zapisem do bazy danych, użyj
timestamptz
kolumny z wartością domyślnąnow()
. Czas systemowy na serwerze DB jest zwykle o wiele bardziej niezawodny i spójny niż wielu klientów podających swoje wyobrażenie o czasie.Na
INSERT
to może być tak proste, jak:I po prostu nie pisz do tej kolumny. Jest wypełniany automatycznie.
źródło
Zawsze należy przechowywać dane w rodzimym typie danych, aby móc korzystać z wbudowanych funkcji. A typ danych znacznika czasu jest oczywiście a
timestamp
.Btw, a nie
timestamp
jest przechowywany jako ciąg, jest przechowywany jako 8-bajtowa liczba całkowita, dokładnie taka sama jak : dokumentacja PostgreSQL .bigint
źródło