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
Où 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 | 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 | 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 | 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.