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

Fonctionnement de la fonction timezone() dans PostgreSQL

Dans PostgreSQL, vous pouvez utiliser le timezone() fonction pour convertir un horodatage vers un autre fuseau horaire.

Syntaxe

La syntaxe ressemble à ceci :

timezone(zone, timestamp)

zone est le fuseau horaire dont vous voulez le timestamp argument à convertir.

Le résultat que vous obtiendrez dépendra du fait que la valeur d'horodatage d'origine inclut ou non un fuseau horaire (et quelle est cette valeur).

Exemple 1 - Lorsque l'horodatage d'origine inclut le fuseau horaire

Voici ce qui se passe lorsque l'horodatage d'origine inclut le fuseau horaire.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');

Résultat :

2020-10-25 04:00:00

Lorsque l'horodatage d'origine inclut le fuseau horaire, le timezone() La fonction décale la valeur d'horodatage d'origine vers le fuseau horaire spécifié et renvoie la valeur sans fuseau horaire.

Voici ce qui se passe si je change le fuseau horaire de l'horodatage d'entrée.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');

Résultat :

2020-10-25 03: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, la valeur d'horodatage d'origine est décalée vers le fuseau horaire local.

SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');

Résultat :

2020-10-24 18:00:00

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

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 '2020-10-25 00:00:00';

Résultat :

2020-10-25 00:00:00+10

Exemple 2 - Lorsque l'horodatage d'origine N'INCLUT PAS le fuseau horaire

Voici ce qui se passe lorsque l'horodatage d'origine n'est pas inclure un fuseau horaire.

SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');

Résultat :

2020-10-25 06: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 timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');

Résultat :

2020-10-25 06: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 '2020-10-25 00:00:00+12';

Résultat :

2020-10-25 00:00:00

Exemple 3 – horodatage local

Utilisons le localtimestamp fonction pour exécuter une comparaison entre l'horodatage actuel dans mon propre fuseau horaire et l'horodatage résultant après l'utilisation de timezone() fonction pour le convertir dans un fuseau horaire différent.

\x
SELECT 
  localtimestamp,
  timezone('Indian/Mauritius', localtimestamp);

Résultat :

localtimestamp | 2020-07-08 15:42:04.965221
timezone       | 2020-07-08 21:42:04.965221+10

Le localtimestamp la fonction renvoie un horodatage type de données, qui vient avec un "sans fuseau horaire" implicite. En d'autres termes, horodatage et horodatage sans fuseau horaire sont la même chose.

Comme démontré précédemment, lorsqu'aucun fuseau horaire n'est spécifié dans l'horodatage d'origine, le TimeZone actuel paramètre est utilisé et ajouté au résultat. Et c'est donc ce que nous obtenons en utilisant localtimestamp .

Au fait, dans cet exemple, j'ai utilisé \x pour afficher le résultat en utilisant l'affichage étendu/la sortie verticale, juste pour le rendre plus facile à lire.

Exemple 4 – horodatage_actuel

Utilisons maintenant le current_timestamp fonction au lieu de localtimestamp .

SELECT 
  current_timestamp,
  timezone('Indian/Mauritius', current_timestamp);

Résultat (en utilisant la sortie verticale) :

current_timestamp | 2020-07-08 15:42:04.335669+10
timezone          | 2020-07-08 09:42:04.335669

Cette fois, le décalage du fuseau horaire a été ajouté à l'horodatage d'origine, et le timezone() le résultat ne l'inclut plus.

Nous obtenons ce résultat car le current_timestamp la fonction renvoie un horodatage avec fuseau horaire type de données.

Exemple 5 - Utilisation des valeurs de temps

Le timezone() la fonction fonctionne aussi avec time valeurs (time with time zone et time without time zone ).

Cependant, lorsque vous l'utilisez à time with time zone valeurs, le décalage horaire est ajouté au résultat.

SELECT 
  timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
  timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
  timezone('Indian/Mauritius', time with time zone '00:00:00');

Résultat (en utilisant la sortie verticale) :

timezone | 04:00:00+04
timezone | 03:00:00+04
timezone | 18:00:00+04

Et pour être complet, voici ces mêmes valeurs en utilisant une time without time zone type de données.

SELECT 
  timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
  timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
  timezone('Indian/Mauritius', time without time zone '00:00:00');

Résultat (en utilisant la sortie verticale) :

timezone | 18:00:00+04
timezone | 18:00:00+04
timezone | 18:00:00+04

Vérifier le fuseau horaire local

Si vous souhaitez vérifier votre propre fuseau horaire local, exécutez SHOW TIMEZONE .

Voici ce que j'obtiens lorsque j'exécute cette commande.

SHOW TIMEZONE;

Résultat :

Australia/Brisbane

Vérifier le décalage horaire

Armé des connaissances ci-dessus, je peux maintenant vérifier les deux décalages de fuseau horaire en interrogeant le pg_timezone_names vue.

SELECT * 
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane';

Résultat (en utilisant la sortie verticale) :

name                | abbrev | utc_offset | is_dst
--------------------+--------+------------+--------
Indian/Mauritius    | +04    | 04:00:00   | f
Australia/Brisbane  | AEST   | 10:00:00   | f

Voir Renvoyer une liste des fuseaux horaires pris en charge par PostgreSQL pour plus d'options et d'exemples de renvoi du fuseau horaire dans PostgreSQL.