PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Trasforma il timestamp nell'ora locale per un determinato fuso orario durante 'COPIA .. IN ..'

Prima di tutto, dovresti usare timestamptz invece di timestamp ogni volta che si lavora con più fusi orari. Eviterei completamente il problema.

Dettagli:

puoi usa il AT TIME ZONE costruire come @NuLo suggerisce , potrebbe funzionano anche, ma non esattamente come descritto.

AT TIME ZONE converte il tipo timestamp (timestamp without time zone ) in timestamptz (timestamp with time zone ) e viceversa. La rappresentazione testuale di un timestamptz il valore dipende dall'impostazione corrente del fuso orario nella sessione in cui si esegue il comando. Questi due timestamptz valori sono identici al 100 % (indicano lo stesso momento):

'2015-09-02 15:55:00+02'::timestamptz
'2015-09-02 14:55:00+01'::timestamptz

Ma la rappresentazione testuale non . Il display è per diversi fusi orari. Se prendi questa stringa letterale e la inserisci in un timestamp digita, la parte del fuso orario viene semplicemente ignorata e finisci con diversi i valori. Quindi, se esegui il tuo COPY dichiarazione in una sessione con la stessa impostazione del fuso orario del tuo timestamp originale i valori sono per l'operazione suggerita succede lavorare.

Il modo più pulito, tuttavia, è produrre un timestamp corretto valori per cominciare applicando AT TIME ZONE due volte :

SELECT event AT TIME ZONE 'my_target_tz' AT TIME ZONE 'my_source_tz', ...
FROM   logtable
ORDER  BY event desc;

'my_target_tz' è "il tuo fuso orario" e 'my_source_tz' il fuso orario del server cloud nell'esempio. Per assicurarti che l'ora legale sia rispettata, usa nomi di fuso orario , non abbreviazioni di fuso orario. La documentazione:

Correlati:

Oppure, molto meglio ancora, usa timestamptz ovunque e funziona correttamente automaticamente.