Обикновено използвахме Google, за да проверим текущото местно време на която и да е държава. В тази публикация давам пример как можете да получите текущо местно време на която и да е държава в PL/SQL. Можете да получите списъка с имена на държави чрез V$TIMEZONE_NAMES преглед в Oracle. Използвам този изглед на речника, за да получа имената на държавата и използвам функцията TZ_OFFSET за получаване на стойността на часовата зона за конкретна държава.
След като получите името на държавата и стойността на часовата зона, можете да използвате командата Alter Session, за да зададете часова зона на текущата сесия. След това можете да получите Current_Timestamp, за да получите текущото местно време на тази държава . По-долу давам пример стъпка по стъпка.
Първо потърсете изгледа V$TIMEZONE_NAMES, като използвате функцията TZ_OFFSET, за да проверите имената на държавите и часовата им зона, както е показано в примера по-долу:
SELECT DISTINCT tzname, TZ_OFFSET (tzname) FROM V$TIMEZONE_NAMES ORDER BY tzname;
Ще получите около 577 реда, нещо като по-долу:
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
Сега, ако искате да знаете какво е текущото местно време в Ню Йорк. След това изпълнявате следната команда Alter Session със стойност на часовата зона на Ню Йорк, която е -04:00. Както е показано по-долу:
ALTER SESSION SET time_zone = '-04:00';
След това направете заявка по-долу, за да получите текущото местно време за Ню Йорк.
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.
След това трябва да зададете часовата зона на локална. Изпълнете следната команда Alter Session, за да възстановите часовата зона:
ALTER SESSION SET time_zone = LOCAL;
Сега, ако направите заявка, както по-горе, ще получите текущото местно време на вашата страна.
Създадох съхранена функция също в PL/SQL, за да получа местното време на която и да е държава, като предам името на държавата като параметър. Но името на държавата на параметъра трябва да е от списъка с имена на държави в V$TIMEZONE_NAMES изглед. По-долу е функцията:
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; /
Сега го използвайте, както е показано по-долу:
SELECT get_current_local_time ('America/New_York') FROM DUAL; C_TIME -------------------------------------------------------- 13-jun-2017 04:33:05 AM 1 row selected.