2013-08-12 13 views
5

Ho bisogno di convertire l'ora locale in UTC utilizzando una funzione. Gli input che ho sono l'ora locale, il fuso orario dell'ora locale (ad esempio "Pacific/Auckland"). Quello che devo ottenere dalla procedura è l'ora UTC per l'ora locale in base a un determinato fuso orario.Come convertire l'ora locale in UTC?

Qualcuno può aiutare?

Sto usando la versione 8.3

+1

http://www.postgresql.org/docs/8.3/static/functions-datetime.html#FUNCTIONS-DATETIME-ZONECONVERT – AdamKG

risposta

16

Questo è trattato nel manual, ma non è sempre evidente come lavorare effettivamente con date/orari. Le specifiche SQL sono un po 'bizzarre.

Nel caso della tua domanda non è chiaro se si desidera memorizzare il tempo in UTC, ma visualizzarla in tempo locale del server (TimeZone), o se si wan di ignorare TimeZone e sempre visualizzarla come UTC. Assumerò quest'ultimo.

Per timestamp si sarebbe semplicemente usare AT TIME ZONE due volte, come:

SELECT TIMESTAMP '2013-08-13 00:00:00' AT TIME ZONE 'Australia/Sydney' AT TIME ZONE 'UTC'; 

è necessario utilizzare AT TIME ZONE due volte. Una volta per convertire l'input da timestamp a timestamptz in base all'argomento fuso orario, quindi un altro per convertirlo in un timestamp in UTC.

Sfortunatamente a causa del modo (IMO insano) la specifica SQL definisce AT TIME ZONE per TIME, non è possibile fare la stessa cosa per TIME. Dovrete manipolare la variabile TimeZone invece:

SET TimeZone = 'UTC'; 
SELECT TIME '07:00' AT TIME ZONE 'Australia/Sydney'; 

Questo ti lascia ancora con un non timetz un time. Quindi il suo valore di visualizzazione cambia con l'impostazione timezone.

+0

+1 per il set TimeZone, questo era il pezzo che mi mancava per provare a convertire il mio timestamp senza fusi orari per utc timestampstz's. Grazie! – grinch

Problemi correlati