Zwykle robiliśmy Google, aby sprawdzić aktualny czas lokalny dowolnego kraju. W tym poście podaję przykład, w jaki sposób można uzyskać aktualny czas lokalny dowolnego kraju w PL/SQL. Możesz uzyskać listę nazw krajów przez V$TIMEZONE_NAMES widok w Oracle. Używam tego widoku słownika, aby uzyskać nazwy krajów i używam funkcji TZ_OFFSET, aby uzyskać wartość strefy czasowej dla danego kraju.
Po uzyskaniu nazwy kraju i wartości strefy czasowej możesz użyć polecenia Zmień sesję, aby ustawić strefę czasową bieżącej sesji. Następnie możesz uzyskać Current_Timestamp, aby uzyskać aktualny czas lokalny tego kraju . Poniżej podaję przykład krok po kroku.
Najpierw wyślij zapytanie do widoku V$TIMEZONE_NAMES za pomocą funkcji TZ_OFFSET, aby sprawdzić nazwy krajów i ich strefę czasową, jak pokazano w poniższym przykładzie:
SELECT DISTINCT tzname, TZ_OFFSET (tzname) FROM V$TIMEZONE_NAMES ORDER BY tzname;
Otrzymasz około 577 wierszy, jak poniżej:
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
Teraz, jeśli chcesz wiedzieć, jaki jest aktualny czas lokalny w Nowym Jorku. Następnie uruchamiasz następujące polecenie Alter Session z wartością Timezone New York, która wynosi -04:00. Jak pokazano poniżej:
ALTER SESSION SET time_zone = '-04:00';
Następnie zapytaj jak poniżej, aby uzyskać aktualny czas lokalny dla Nowego Jorku.
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.
Następnie należy ustawić strefę czasową na lokalną. Uruchom następujące polecenie Alter Session, aby przywrócić strefę czasową:
ALTER SESSION SET time_zone = LOCAL;
Teraz, jeśli zapytasz jak powyżej, otrzymasz aktualny czas lokalny w swoim kraju.
Stworzyłem funkcję przechowywaną również w PL/SQL, aby uzyskać czas lokalny dowolnego kraju, przekazując nazwę kraju jako parametr. Jednak nazwa kraju parametru powinna znajdować się na liście nazw krajów w widoku V$TIMEZONE_NAMES. Poniżej znajduje się funkcja:
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; /
Teraz użyj go, jak pokazano poniżej:
SELECT get_current_local_time ('America/New_York') FROM DUAL; C_TIME -------------------------------------------------------- 13-jun-2017 04:33:05 AM 1 row selected.