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.