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.