sql >> Databasteknik >  >> RDS >> Oracle

Få aktuell lokal tid för alla länder i PL/SQL

Vanligtvis brukade vi använda Google för att kontrollera aktuell lokal tid i vilket land som helst. I det här inlägget ger jag ett exempel på hur du kan få aktuell lokal tid i vilket land som helst i PL/SQL. Du kan få listan över landsnamn via V$TIMEZONE_NAMES visa i Oracle. Jag använder den här ordboksvyn för att få namnen på landet och använder TZ_OFFSET-funktionen för att få tidszonvärdet för ett visst land.

Efter att ha fått landsnamn och tidszonvärde kan du använda kommandot Alter Session för att ställa in tidszonen för den aktuella sessionen. Efter det kan du få Current_Timestamp för att få aktuell lokal tid för det landet . Nedan ger jag exempel steg för steg.

Fråga först vyn V$TIMEZONE_NAMES med TZ_OFFSET-funktionen för att kontrollera landsnamnen och deras tidszon, som visas i exemplet nedan:

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

Du kommer att få cirka 577 rader ungefär som nedan:

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

Nu om du vill veta vad är den aktuella lokala tiden i New York. Sedan kör du följande Alter Session-kommando med tidszonvärdet New York, vilket är -04:00. Som visas nedan:

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

Fråga sedan enligt nedan för att få aktuell lokal tid för 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.

Efter det bör du ställa in tidszonen till lokal. Kör följande Alter Session-kommando för att återställa tidszonen:

ALTER SESSION SET time_zone = LOCAL;

Om du nu vill fråga enligt ovan får du aktuell lokal tid i ditt land.

Jag har skapat en lagrad funktion även i PL/SQL för att få lokal tid för vilket land som helst genom att skicka landsnamnet som parameter. Men parameterns landsnamn ska vara från listan över landsnamn i vyn V$TIMEZONE_NAMES. Nedan är 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;
/

Använd den nu som visas nedan:

SELECT get_current_local_time ('America/New_York') FROM DUAL;
C_TIME 
--------------------------------------------------------
13-jun-2017 04:33:05 AM 
1 row selected.
  1. Förbättringar av framstegsrapportering i PostgreSQL 12

  2. Hur man övervinner oavsiktlig radering av data i MySQL &MariaDB

  3. COSH() Funktion i Oracle

  4. [Video] Introduktion till JSON-datatyper i PostgreSQL