sql >> Database >  >> RDS >> Oracle

Ontvang de huidige lokale tijd van elk land in PL/SQL

Meestal gebruikten we Google om de huidige lokale tijd van elk land te controleren. In dit bericht geef ik een voorbeeld, hoe je de huidige lokale tijd van elk land in PL/SQL kunt krijgen. U kunt de lijst met landnamen verkrijgen via V$TIMEZONE_NAMES bekijken in Orakel. Ik gebruik deze woordenboekweergave om de namen van landen te krijgen en gebruik de TZ_OFFSET-functie om de tijdzonewaarde te krijgen voor een bepaald land.

Nadat u de landnaam en de tijdzonewaarde hebt gekregen, kunt u de opdracht Sessie wijzigen gebruiken om de tijdzone van de huidige sessie in te stellen. Daarna kunt u Current_Timestamp krijgen om de huidige lokale tijd van dat land te krijgen . Hieronder geef ik stap voor stap een voorbeeld.

Vraag eerst de weergave V$TIMEZONE_NAMES op met de functie TZ_OFFSET om de landnamen en hun tijdzone te controleren, zoals in het onderstaande voorbeeld:

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

Je krijgt ongeveer 577 rijen, ongeveer zoals hieronder:

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

Als u nu wilt weten wat de huidige lokale tijd in New York is. Vervolgens voert u de volgende Alter Session-opdracht uit met de tijdzonewaarde New York, namelijk -04:00. Zoals hieronder getoond:

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

Zoek vervolgens zoals hieronder om de huidige lokale tijd voor New York te krijgen.

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.

Daarna moet u de tijdzone op lokaal instellen. Voer de volgende Alter Session-opdracht uit om de tijdzone te herstellen:

ALTER SESSION SET time_zone = LOCAL;

Als u nu een zoekopdracht uitvoert zoals hierboven, krijgt u de huidige lokale tijd van uw land.

Ik heb ook een opgeslagen functie in PL/SQL gemaakt om de lokale tijd van elk land te krijgen door de landnaam als parameter door te geven. De landnaam van de parameter moet echter voorkomen in de lijst met landnamen in de weergave V$TIMEZONE_NAMES. Hieronder is de functie:

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

Gebruik het nu zoals hieronder getoond:

SELECT get_current_local_time ('America/New_York') FROM DUAL;
C_TIME 
--------------------------------------------------------
13-jun-2017 04:33:05 AM 
1 row selected.
  1. Krijg laatste insert-ID na een voorbereide insert met PDO

  2. Hoe de volgorde in postgres opnieuw in te stellen en de id-kolom te vullen met nieuwe gegevens?

  3. Master High Availability Manager (MHA) is gecrasht! Wat moet ik nu doen?

  4. MS Access corruptie Deel 1:Veelvoorkomende oorzaken