2013-05-17 8 views
87

Ho una colonna del tipo TIMESTAMP WITHOUT TIME ZONE e vorrei avere quell'impostazione predefinita sull'ora corrente in UTC. Ottenere l'ora corrente in UTC è facile:Utilizzo dell'ora corrente in UTC come valore predefinito in PostgreSQL

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

Come è usando il timestamp corrente per una colonna:

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) 

Ma che utilizza l'ora locale. Il tentativo di imporre che ai risultati UTC in un errore di sintassi:

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

risposta

178

Una funzione non è nemmeno necessario. Basta mettere parentesi attorno l'espressione di default:

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

posso vedere un funciton come now_utc() brilla veramente quando si scrivono le query – misaxi

+0

Questo funziona anche quando il tempo passa indietro di un'ora - ora() restituisce un timestamp che conosce la compensato da UTC. –

14

avvolgerla in una funzione:

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

Che dire

now()::timestamp 

Se il vostro altro timestamp sono senza fuso orario, allora questo cast produrrà il tipo di corrispondenza "timestamp senza fuso orario" per l'ora corrente .

Mi piacerebbe leggere cosa pensano gli altri di questa opzione, però. Ancora non mi fido della mia comprensione di questo "con/senza" fuso orario.

+0

È un trucco interessante ma può portare a confusione se non si è a conoscenza di questo comportamento. La risposta accettata è chiara sull'azione e il risultato desiderato. Lo stesso con la funzione, ma sto lontano dalle funzioni in DB .... –

2

Ancora un'altra soluzione:

timezone('utc', now()) 
Problemi correlati