PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment convertir l'heure locale en UTC ?

Ceci est couvert dans le manuel , mais il n'est pas toujours évident de savoir comment travailler avec les dates/heures. La spécification SQL est un peu bizarre.

Dans le cas de votre question, il n'est pas clair si vous souhaitez stocker l'heure en UTC mais l'afficher dans l'heure locale du serveur (TimeZone ), ou si vous voulez ignorer TimeZone et toujours l'afficher en UTC. Je suppose que ce dernier.

Pour les horodatages, vous utiliserez simplement AT TIME ZONE deux fois, comme :

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

Vous devez utiliser AT TIME ZONE deux fois. Une fois pour convertir l'entrée timestamp à timestamptz selon l'argument fuseau horaire, puis un autre pour le convertir en un timestamp à UTC.

Malheureusement, à cause de la manière (insensée de l'OMI) dont la spécification SQL définit AT TIME ZONE pendant TIME , vous ne pouvez pas faire la même chose pour TIME . Vous devrez manipuler le TimeZone variable à la place :

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

Cela vous laisse toujours avec un timetz pas une time . Donc sa valeur d'affichage change avec le timezone réglage.