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

Comment AT TIME ZONE fonctionne dans PostgreSQL

Dans PostgreSQL, vous pouvez utiliser le AT TIME ZONE clause pour convertir un horodatage vers un autre fuseau horaire.

Syntaxe

Vous pouvez l'utiliser avec l'une des trois variantes suivantes :

timestamp with time zone AT TIME ZONE zone
timestamp without time zone AT TIME ZONE zone
time with time zone AT TIME ZONE zone

zone est le fuseau horaire dans lequel vous voulez que la valeur de gauche soit convertie.

Juste pour être clair, la seule différence entre les trois variantes réside dans le type de données de l'horodatage à convertir.

Les trois types de données sont :

  • timestamp with time zone
  • timestamp without time zone
  • time with time zone

Le résultat que vous obtiendrez dépendra du type de données.

Le tableau suivant décrit le résultat produit par chaque variante.

Expression Type de retour Description
timestamp with time zone AT TIME ZONE zone timestamp without time zone Convertir l'horodatage donné avec le fuseau horaire au nouveau fuseau horaire, sans désignation de fuseau horaire
timestamp without time zone AT TIME ZONE zone timestamp with time zone Traiter l'horodatage donné sans fuseau horaire comme situé dans le fuseau horaire spécifié
time with time zone AT TIME ZONE zone time with time zone Convertir l'heure donnée avec le fuseau horaire au nouveau fuseau horaire

Variante 1

Voici ce qui se passe lorsque vous convertissez un timestamp with time zone valeur.

SELECT timestamp with time zone '2025-11-20 00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Résultat :

2025-11-20 02:00:00

Lorsque l'horodatage d'origine est un timestamp with time zone valeur, elle est décalée vers le fuseau horaire spécifié et le résultat est renvoyé sans décalage de fuseau horaire.

Voici ce qui se passe si je modifie le décalage horaire de la valeur d'entrée.

SELECT timestamp with time zone '2025-11-20 00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Résultat :

2025-11-20 01:00:00

L'horodatage résultant est décalé en fonction du fuseau horaire d'entrée.

Et si vous spécifiez timestamp with time zone , mais l'horodatage d'origine n'inclut pas réellement de fuseau horaire, alors le fuseau horaire local est supposé.

SELECT timestamp with time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Résultat :

2025-11-19 16:00:00

Dans ce cas, l'horodatage résultant a été reculé de huit heures. Cela signifie que mon fuseau horaire local a huit heures d'avance sur Africa/Cairo.

Nous pouvons voir le décalage de fuseau horaire qui a été utilisé en sélectionnant directement la valeur d'entrée.

SELECT timestamp with time zone '2025-11-20 00:00:00';

Résultat :

2025-11-20 00:00:00+10

Variante 2

Voici ce qui se passe lorsque l'horodatage d'origine utilise un timestamp without time zone valeur.

En d'autres termes, ce n'est pas le cas inclure un fuseau horaire.

SELECT timestamp without time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Résultat :

2025-11-20 08:00:00+10

Lorsque l'horodatage d'origine n'inclut pas de fuseau horaire, le résultat est affiché en utilisant le TimeZone actuel réglage et le décalage du fuseau horaire est ajouté.

Cela s'applique à chaque fois que vous spécifiez timestamp without time zone , même si l'horodatage contient en fait un décalage de fuseau horaire.

SELECT timestamp without time zone '2025-11-20 00:00:00+12' AT TIME ZONE 'Africa/Cairo';

Résultat :

2025-11-20 08:00:00+10

Il faut s'y attendre, car si je sélectionne uniquement le timestamp without time zone valeur, voici ce que j'obtiens :

SELECT timestamp without time zone '2025-11-20 00:00:00+12';

Résultat :

2025-11-20 00:00:00

Variante 3

Voici ce qui se passe lorsque l'horodatage d'origine utilise une time with time zone valeur.

SELECT time with time zone '00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Résultat :

02:00:00+02

Il convertit l'time with time zone donné valeur au nouveau fuseau horaire et ajoute le décalage horaire au résultat.

Voici ce qui se passe si je modifie le décalage horaire de la valeur d'entrée.

SELECT time with time zone '00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Résultat :

01:00:00+02

L'horodatage résultant est décalé en fonction du fuseau horaire d'entrée.

Et si vous spécifiez time with time zone , mais l'horodatage d'origine n'inclut pas réellement de fuseau horaire, le fuseau horaire local est supposé.

SELECT time with time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Résultat :

16:00:00+02

Dans ce cas, l'horodatage résultant a été reculé de huit heures (car mon fuseau horaire local a huit heures d'avance sur Africa/Cairo).

Nous pouvons voir le décalage de fuseau horaire qui a été utilisé en sélectionnant directement la valeur d'entrée.

SELECT time with time zone '00:00:00';

Résultat :

00:00:00+10

Heure sans fuseau horaire

Bien que la documentation de Postgres n'inclue pas de time without time zone variante, voici quand même un exemple.

SELECT time without time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Résultat :

16:00:00+02

Ainsi, dans cet exemple, le fuseau horaire local a été supposé pour le fuseau horaire à convertir.