sql >> Base de Datos >  >> RDS >> Oracle

Obtenga la hora local actual de cualquier país en PL/SQL

Por lo general, solíamos hacer Google para verificar la hora local actual de cualquier país. En esta publicación, doy un ejemplo de cómo puede obtener la hora local actual de cualquier país en PL/SQL. Puede obtener la lista de nombres de países a través de V$TIMEZONE_NAMES ver en Oracle. Estoy usando esta vista de diccionario para obtener los nombres de los países y usando la función TZ_OFFSET para obtener el valor de la zona horaria para un país en particular.

Después de obtener el nombre del país y el valor de la zona horaria, puede usar el comando Modificar sesión para establecer la zona horaria de la sesión actual. Después de eso, puede obtener Current_Timestamp para obtener la hora local actual de ese país . A continuación doy un ejemplo paso a paso.

Primero consulte la vista V$TIMEZONE_NAMES usando la función TZ_OFFSET para verificar los nombres de los países y su zona horaria, como se muestra en el siguiente ejemplo:

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

Obtendrá alrededor de 577 filas algo así como a continuación:

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

Ahora, si desea saber cuál es la hora local actual en Nueva York. Luego, ejecuta el siguiente comando Alterar sesión con el valor de zona horaria de Nueva York, que es -04:00. Como se muestra a continuación:

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

Luego consulta como se muestra a continuación para obtener la hora local actual de Nueva 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.

Después de eso, debe establecer la zona horaria en local. Ejecute el siguiente comando Alterar sesión para restaurar la zona horaria:

ALTER SESSION SET time_zone = LOCAL;

Ahora, si realiza la consulta como se indicó anteriormente, obtendrá la hora local actual de su país.

He creado una función almacenada también en PL/SQL para obtener la hora local de cualquier país pasando el nombre del país como parámetro. Pero el nombre del país del parámetro debe ser de la lista de nombres de países en la vista V$TIMEZONE_NAMES. A continuación se muestra la función:

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;
/

Ahora utilícelo como se muestra a continuación:

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