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

Transforme l'horodatage en heure locale pour un fuseau horaire donné pendant 'COPY .. TO ..'

Tout d'abord, vous devez utiliser timestamptz au lieu de timestamp chaque fois que vous travaillez avec plusieurs fuseaux horaires. Éviterait complètement le problème.

Détails :

Vous pouvez utilisez le AT TIME ZONE construire comme @NuLo suggère , il peut fonctionne même, mais pas exactement comme décrit.

AT TIME ZONE convertit le type timestamp (timestamp without time zone ) à timestamptz (timestamp with time zone ) et vice versa. La représentation textuelle d'un timestamptz la valeur dépend du paramètre actuel du fuseau horaire de la session dans laquelle vous exécutez la commande. Ces deux timestamptz valeurs sont identiques à 100 % (indiquent le même point dans le temps) :

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

Mais la représentation textuelle n'est pas . L'affichage correspond à différents fuseaux horaires. Si vous prenez cette chaîne littérale et l'alimentez avec un timestamp type, la partie fuseau horaire est juste ignorée et vous vous retrouvez avec différent valeurs. Par conséquent, si vous exécutez votre COPY déclaration dans une session avec le même paramètre de fuseau horaire que votre timestamp d'origine les valeurs sont pour, l'opération suggérée se produit travailler.

La manière propre, cependant, est de produire un timestamp correct valeurs pour commencer en appliquant AT TIME ZONE deux fois :

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

'my_target_tz' est "votre propre fuseau horaire" et 'my_source_tz' le fuseau horaire du serveur cloud dans l'exemple. Pour vous assurer que l'heure d'été est respectée, utilisez des noms de fuseau horaire , pas les abréviations de fuseau horaire. La documentation :

Connexe :

Ou, bien mieux encore, utilisez timestamptz partout et cela fonctionne correctement automatiquement.