Oracle
 sql >> Database >  >> RDS >> Oracle

Ottieni l'ora locale corrente di qualsiasi paese in PL/SQL

Di solito usavamo Google per controllare l'ora locale corrente di qualsiasi paese. In questo post sto fornendo un esempio, come ottenere l'ora locale corrente di qualsiasi paese in PL/SQL. Puoi ottenere l'elenco dei nomi dei paesi tramite V$TIMEZONE_NAMES visualizzare in Oracle. Sto usando questa visualizzazione dizionario per ottenere i nomi del paese e utilizzo la funzione TZ_OFFSET per ottenere il valore del fuso orario per un determinato paese.

Dopo aver ottenuto il nome del paese e il valore del fuso orario, è possibile utilizzare il comando Alter Session per impostare il fuso orario della sessione corrente. Successivamente puoi ottenere Current_Timestamp per ottenere l'ora locale corrente di quel paese . Di seguito riporto un esempio passo dopo passo.

Per prima cosa interroga la vista V$TIMEZONE_NAMES utilizzando la funzione TZ_OFFSET per controllare i nomi dei paesi e il relativo fuso orario, come mostrato nell'esempio seguente:

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

Otterrai circa 577 righe come di seguito:

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

Ora, se vuoi sapere qual è l'ora locale attuale a New York. Quindi esegui il seguente comando Alter Session con il valore Timezone di New York, che è -04:00. Come mostrato di seguito:

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

Quindi esegui la query come di seguito per ottenere l'ora locale corrente per 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.

Dopodiché dovresti impostare il fuso orario su locale. Esegui il seguente comando Alter Session per ripristinare il fuso orario:

ALTER SESSION SET time_zone = LOCAL;

Ora, se esegui una query come sopra, otterrai l'ora locale attuale del tuo paese.

Ho creato una funzione memorizzata anche in PL/SQL per ottenere l'ora locale di qualsiasi paese passando il nome del paese come parametro. Ma il nome del paese del parametro dovrebbe essere compreso nell'elenco dei nomi dei paesi nella vista V$TIMEZONE_NAMES. Di seguito la funzione:

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

Ora usalo come mostrato di seguito:

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