Mam kolumnę tego TIMESTAMP WITHOUT TIME ZONE
typu i chciałbym mieć domyślną aktualną godzinę w UTC. Uzyskanie aktualnego czasu w UTC jest łatwe:
postgres=# select now() at time zone 'utc';
timezone
----------------------------
2013-05-17 12:52:51.337466
(1 row)
Tak jak przy użyciu aktualnego znacznika czasu dla kolumny:
postgres=# create temporary table test(id int, ts timestamp without time zone default current_timestamp);
CREATE TABLE
postgres=# insert into test values (1) returning ts;
ts
----------------------------
2013-05-17 14:54:33.072725
(1 row)
Ale to wykorzystuje czas lokalny. Próba wymuszenia tego na UTC powoduje błąd składniowy:
postgres=# create temporary table test(id int, ts timestamp without time zone default now() at time zone 'utc');
ERROR: syntax error at or near "at"
LINE 1: ...int, ts timestamp without time zone default now() at time zo...
postgresql
timezone
timestamp
Wichert Akkerman
źródło
źródło
ALTER TABLE testcase_result ADD COLUMN date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT (NOW() AT TIME ZONE "UTC") NOT NULL;
nie powiedzie się z:ERROR: column "UTC" does not exist
. Upewnij się, że'utc'
wszystko jest pisane małymi literami.'utc'
ciąg musi być również umieszczony w apostrofach, a nie w podwójnych cudzysłowach.Jeszcze inne rozwiązanie:
źródło
Owiń to w funkcję:
źródło
Co powiesz na
Jeśli Twoja inna sygnatura czasowa nie zawiera strefy czasowej, to przesyłanie zwróci pasujący typ „znacznik czasu bez strefy czasowej” dla bieżącego czasu.
Chciałbym jednak przeczytać, co inni myślą o tej opcji. Nadal nie ufam swojemu zrozumieniu tych rzeczy „z / bez” strefy czasowej.
EDYCJA: Dodanie tutaj komentarza Michaela Ekoki, ponieważ wyjaśnia ważną kwestię:
źródło
Oto 2 równoważne rozwiązania:
(w poniższym kodzie, należy podstawić
'UTC'
do strefy inow()
dla znacznika czasu )timestamp AT TIME ZONE zone
- zgodny ze standardem SQLtimezone(zone, timestamp)
- prawdopodobnie bardziej czytelnyWyjaśnienie:
'UTC'
) lub jako interwał (np.INTERVAL '-08:00'
) - tutaj znajduje się lista wszystkich dostępnych stref czasowychnow()
zwraca wartość typu znacznik czasu (dokładnie to, czego potrzebujemy) z dołączoną domyślną strefą czasową bazy danych (np2018-11-11T12:07:22.3+05:00
.).timezone('UTC', now())
zamienia nasz aktualny czas (typu znacznik czasu ze strefą czasową ) na bezczasowy odpowiednik w formacieUTC
.Np .
SELECT timestamp with time zone '2020-03-16 15:00:00-05' AT TIME ZONE 'UTC'
Wróci2020-03-16T20:00:00Z
.Dokumenty: strefa czasowa ()
źródło
at timezone 'utc'
i to nie działa z moją konfiguracją PostgreSQL. Problem z użyciem wielkich liter rozwiązanyFunkcja już istnieje: strefa czasowa ('UTC' :: text, now ())
źródło