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

Få aktuel lokaltid i ethvert land i PL/SQL

Normalt plejede vi at bruge Google for at tjekke den aktuelle lokale tid i ethvert land. I dette indlæg giver jeg et eksempel på, hvordan du kan få aktuel lokal tid i ethvert land i PL/SQL. Du kan få listen over landenavne gennem V$TIMEZONE_NAMES se i Oracle. Jeg bruger denne ordbogsvisning til at få navne på lande og bruger TZ_OFFSET-funktionen til at få tidszoneværdien for et bestemt land.

Efter at have fået landets navn og tidszoneværdi, kan du bruge kommandoen Alter Session til at indstille tidszonen for den aktuelle session. Derefter kan du få Current_Timestamp for at få den aktuelle lokale tid for det pågældende land . Nedenfor giver jeg et eksempel trin for trin.

Forespørg først i V$TIMEZONE_NAMES-visningen ved hjælp af TZ_OFFSET-funktionen for at kontrollere landenavnene og deres tidszone, som vist i nedenstående eksempel:

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

Du vil få omkring 577 rækker noget som nedenfor:

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

Hvis du nu vil vide, hvad er den aktuelle lokale tid i New York. Så kører du følgende Alter Session-kommando med tidszoneværdien New York, som er -04:00. Som vist nedenfor:

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

Spørg derefter som nedenfor for at få den aktuelle lokale tid for 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.

Derefter skal du indstille tidszonen til lokal. Kør følgende Alter Session-kommando for at gendanne tidszonen:

ALTER SESSION SET time_zone = LOCAL;

Hvis du nu vil forespørge som ovenfor, får du den aktuelle lokale tid i dit land.

Jeg har oprettet en gemt funktion også i PL/SQL for at få den lokale tid for ethvert land ved at sende landenavnet som parameter. Men parameterens landenavn skal være fra listen over landenavne i V$TIMEZONE_NAMES-visningen. Nedenfor er funktionen:

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

Brug det nu som vist nedenfor:

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

  2. Har T-SQL en aggregeret funktion til at sammenkæde strenge?

  3. Få ID'et for en ny post indsat i en database fra den returnerede Uri

  4. Database Performance Tuning til MariaDB