2013-05-17 13 views
87

Mam kolumnę typu TIMESTAMP WITHOUT TIME ZONE i chciałbym mieć tę domyślną wartość bieżącego czasu w UTC. Pierwsze aktualny czas UTC jest proste:Użycie bieżącego czasu w UTC jako wartości domyślnej w PostgreSQL

postgres=# select now() at time zone 'utc'; 
      timezone   
---------------------------- 
2013-05-17 12:52:51.337466 
(1 row) 

Jak użyciu bieżącego 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 który używa czasu lokalnego. Próbując wymusić, że do wyników UTC w błąd składni:

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

Odpowiedz

178

funkcja nie jest jeszcze konieczna. Wystarczy umieścić nawiasy wokół domyślnego wyrażenia:

create temporary table test(
    id int, 
    ts timestamp without time zone default (now() at time zone 'utc') 
); 
+0

widzę funciton jak now_utc() naprawdę błyszczy podczas pisania zapytań – misaxi

+0

To działa nawet gdy czas wraca godzinę - teraz() zwraca znacznik czasu, który zna przesunięcie z UTC. –

14

owinąć go w funkcji:

create function now_utc() returns timestamp as $$ 
    select now() at time zone 'utc'; 
$$ language sql; 

create temporary table test(
    id int, 
    ts timestamp without time zone default now_utc() 
); 
11

Co o

now()::timestamp 

Jeśli inny znacznik czasu są bez strefy czasowej to ta obsada przyniesie typ dopasowania „timestamp bez strefy czasowej” do chwili obecnej .

Chciałbym przeczytać, co inni myślą o tej opcji. Nadal nie ufam mojemu zrozumieniu tego "strefy czasowej" z/bez "strefy czasowej".

+0

To ciekawa sztuczka, ale może prowadzić do zamieszania, chyba że jesteś świadomy tego zachowania. Przyjęta odpowiedź jest krystalicznie jasna na temat działania i pożądanego rezultatu. To samo z funkcją, ale trzymam się z dala od funkcji w DB ... –

2

Jeszcze inne rozwiązanie:

timezone('utc', now()) 
Powiązane problemy