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

Obtenir l'heure locale actuelle de n'importe quel pays en PL/SQL

Habituellement, nous avions l'habitude de faire Google pour vérifier l'heure locale actuelle de n'importe quel pays. Dans ce post, je donne un exemple, comment vous pouvez obtenir l'heure locale actuelle de n'importe quel pays en PL/SQL. Vous pouvez obtenir la liste des noms de pays via V$TIMEZONE_NAMES voir dans Oracle. J'utilise cette vue dictionnaire pour obtenir les noms de pays et utiliser la fonction TZ_OFFSET pour obtenir la valeur du fuseau horaire pour un pays particulier.

Après avoir obtenu le nom du pays et la valeur du fuseau horaire, vous pouvez utiliser la commande Alter Session pour définir le fuseau horaire de la session en cours. Après cela, vous pouvez obtenir Current_Timestamp pour obtenir l'heure locale actuelle de ce pays . Ci-dessous, je donne un exemple étape par étape.

Interrogez d'abord la vue V$TIMEZONE_NAMES à l'aide de la fonction TZ_OFFSET pour vérifier les noms de pays et leur fuseau horaire, comme illustré dans l'exemple ci-dessous :

 SELECT DISTINCT tzname, TZ_OFFSET (tzname)
 FROM V$TIMEZONE_NAMES
ORDER BY tzname;

Vous obtiendrez environ 577 lignes comme ci-dessous :

America/Mexico_City -05:00 
America/Miquelon -02:00 
America/Moncton -03:00 
America/Monterrey -05:00 
America/Montevideo -03:00 
America/Montreal -04:00 
America/Montserrat -04:00 
America/Nassau -04:00 
America/New_York -04:00

Maintenant, si vous voulez savoir quelle est l'heure locale actuelle à New York. Ensuite, vous exécutez la commande Alter Session suivante avec la valeur Timezone de New York, qui est -04:00. Comme indiqué ci-dessous :

ALTER SESSION SET time_zone = '-04:00';

Puis interrogez comme ci-dessous pour obtenir l'heure locale actuelle de New York.

SELECT TO_CHAR (CURRENT_TIMESTAMP, 'dd-mon-yyyy HH:mi:ss PM') c_time
 FROM DUAL;
C_TIME 
--------------------------------
13-jun-2017 04:26:10 AM 
1 row selected.

Après cela, vous devez définir le fuseau horaire sur local. Exécutez la commande Alter Session suivante pour restaurer le fuseau horaire :

ALTER SESSION SET time_zone = LOCAL;

Maintenant, si vous interrogez comme ci-dessus, vous obtiendrez l'heure locale actuelle de votre pays.

J'ai créé une fonction stockée également en PL/SQL pour obtenir l'heure locale de n'importe quel pays en passant le nom du pays en paramètre. Toutefois, le nom du pays du paramètre doit provenir de la liste des noms de pays dans la vue V$TIMEZONE_NAMES. Ci-dessous la fonction :

CREATE OR REPLACE FUNCTION get_current_local_time (country_name IN VARCHAR2)
 RETURN VARCHAR2
IS
 CURSOR c_tz (p_country_name IN VARCHAR2)
 IS
 SELECT DISTINCT tzname, TZ_OFFSET (tzname) z_offset 
 FROM V$TIMEZONE_NAMES
 WHERE UPPER (tzname) = UPPER (p_country_name) AND ROWNUM = 1;

v_offset VARCHAR2 (100);
 vtime VARCHAR2 (100);
BEGIN
 FOR c IN c_tz (country_name)
 LOOP
 v_offset := c.z_offset;
 END LOOP;

EXECUTE IMMEDIATE 'Alter Session Set time_zone = '
 || CHR (39)
 || v_offset
 || CHR (39);

SELECT TO_CHAR (CURRENT_TIMESTAMP, 'dd-mon-yyyy HH:mi:ss PM')
 INTO vtime
 FROM DUAL;

/* restore local time for current session*/
 EXECUTE IMMEDIATE 'Alter Session Set time_zone = local';

RETURN (vtime);
EXCEPTION
 WHEN OTHERS
 THEN
 RETURN '';
END;
/

Utilisez-le maintenant comme indiqué ci-dessous :

SELECT get_current_local_time ('America/New_York') FROM DUAL;
C_TIME 
--------------------------------------------------------
13-jun-2017 04:33:05 AM 
1 row selected.