sql >> Databáze >  >> RDS >> Oracle

Získejte aktuální místní čas libovolné země v PL/SQL

Obvykle jsme používali Google, abychom zkontrolovali aktuální místní čas jakékoli země. V tomto příspěvku uvádím příklad, jak můžete získat aktuální místní čas jakékoli země v PL/SQL. Seznam názvů zemí můžete získat prostřednictvím V$TIMEZONE_NAMES zobrazit v Oracle. Toto zobrazení slovníku používám k získání názvů zemí a používám funkci TZ_OFFSET k získání hodnoty časového pásma pro konkrétní zemi.

Po získání názvu země a hodnoty časového pásma můžete použít příkaz Alter Session k nastavení časového pásma aktuální relace. Poté můžete získat Current_Timestamp, abyste získali aktuální místní čas dané země . Níže uvádím příklad krok za krokem.

Nejprve vyhledejte zobrazení V$TIMEZONE_NAMES pomocí funkce TZ_OFFSET a zkontrolujte názvy zemí a jejich časové pásmo, jak je znázorněno v příkladu níže:

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

Získáte přibližně 577 řádků, něco jako níže:

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

Nyní, pokud chcete vědět, jaký je aktuální místní čas v New Yorku. Potom spustíte následující příkaz Alter Session s hodnotou časového pásma New York, což je -04:00. Jak je uvedeno níže:

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

Poté dotazem níže získáte aktuální místní čas pro 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.

Poté byste měli nastavit časové pásmo na místní. Spuštěním následujícího příkazu Alter Session obnovte časové pásmo:

ALTER SESSION SET time_zone = LOCAL;

Nyní, pokud budete dotazovat výše uvedeným způsobem, získáte aktuální místní čas vaší země.

Vytvořil jsem uloženou funkci také v PL/SQL, abych získal místní čas jakékoli země předáním názvu země jako parametru. Název země parametru by však měl být ze seznamu názvů zemí v zobrazení V$TIMEZONE_NAMES. Níže je funkce:

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

Nyní jej použijte, jak je znázorněno níže:

SELECT get_current_local_time ('America/New_York') FROM DUAL;
C_TIME 
--------------------------------------------------------
13-jun-2017 04:33:05 AM 
1 row selected.
  1. Nechte se zapálit pomocí Apache Spark – část 1

  2. Porovnat řetězce ignorující akcenty v SQL (ORACLE)

  3. Nejlepší způsob, jak hostovat MySQL v Azure Cloud

  4. Advanced SQL:CROSS APPLY a OUTER APPLY