Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Obtenha a hora local atual de qualquer país em PL/SQL


Normalmente, costumávamos fazer o Google para verificar a hora local atual de qualquer país. Neste post estou dando um exemplo de como você pode obter a hora local atual de qualquer país em PL/SQL. Você pode obter a lista de nomes de países por meio de V$TIMEZONE_NAMES ver no Oracle. Estou usando esta visão de dicionário para obter os nomes dos países e usando a função TZ_OFFSET para obter o valor do fuso horário para determinado país.

Depois de obter o nome do país e o valor do fuso horário, você pode usar o comando Alter Session para definir o fuso horário da sessão atual. Depois disso, você pode obter Current_Timestamp para obter a hora local atual desse país . Abaixo estou dando exemplo passo a passo.

Primeiro, consulte a visualização V$TIMEZONE_NAMES usando a função TZ_OFFSET para verificar os nomes dos países e seus fusos horários, conforme mostrado no exemplo abaixo:
 SELECT DISTINCT tzname, TZ_OFFSET (tzname)
 FROM V$TIMEZONE_NAMES
ORDER BY tzname;

Você obterá cerca de 577 linhas, algo como abaixo:
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

Agora, se você quer saber qual é a hora local atual em Nova York. Em seguida, você executa o seguinte comando Alter Session com o valor de fuso horário de Nova York, que é -04:00. Como mostrado abaixo:
ALTER SESSION SET time_zone = '-04:00';

Em seguida, consulte como abaixo para obter a hora local atual de Nova 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.



Depois disso, você deve definir o fuso horário para local. Execute o seguinte comando Alter Session para restaurar o fuso horário:
ALTER SESSION SET time_zone = LOCAL;

Agora, se você consultar como acima, obterá a hora local atual do seu país.

Criei uma função armazenada também em PL/SQL para obter a hora local de qualquer país passando o nome do país como parâmetro. Mas o nome do país do parâmetro deve ser da lista de nomes de países na visualização V$TIMEZONE_NAMES. Abaixo segue a função:
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;
/

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