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

Come restituire un elenco di fusi orari validi nel database Oracle

A volte è necessario specificare un fuso orario quando si utilizzano le funzioni datetime in Oracle.

Ma ci sono molti fusi orari là fuori. Come li ricordiamo tutti? E come facciamo a sapere che il nostro sistema supporta un determinato fuso orario?

Fortunatamente, possiamo interrogare il V$TIMEZONE_NAMES visualizza per restituire un elenco di fusi orari validi.

Ricevi tutte le informazioni sul fuso orario

Il codice seguente restituisce tutte le righe e le colonne dalla vista:

SELECT * FROM V$TIMEZONE_NAMES;

Ci sono molte righe in questa visualizzazione, ma ecco come appaiono le prime 10 righe:

               TZNAME    TZABBREV    CON_ID 
_____________________ ___________ _________ 
Africa/Abidjan        LMT                 0 
Africa/Abidjan        GMT                 0 
Africa/Accra          LMT                 0 
Africa/Accra          GMT                 0 
Africa/Accra          +0020               0 
Africa/Addis_Ababa    LMT                 0 
Africa/Addis_Ababa    EAT                 0 
Africa/Addis_Ababa    +0230               0 
Africa/Addis_Ababa    +0245               0 
Africa/Algiers        LMT                 0 
...

Possiamo vedere che ogni nome di regione del fuso orario ha più di un'abbreviazione corrispondente. Questo si occupa di cose come l'ora legale, ecc.

Ecco una tabella che delinea il significato di alcune abbreviazioni:

Abbreviazione del fuso orario Significato
LMT Tempo medio locale
PMT Tempo medio di Parigi
BAGNATO Ora dell'Europa occidentale
OVEST Ora legale dell'Europa occidentale
CET Ora dell'Europa centrale
CEST Ora legale dell'Europa centrale
EET Ora dell'Europa orientale
EST Ora estiva dell'Europa orientale

Ottieni solo i nomi delle regioni

Possiamo usare il DISTINCT o UNIQUE clausola per restituire solo i nomi delle regioni del fuso orario senza duplicati.

SELECT DISTINCT TZNAME 
FROM V$TIMEZONE_NAMES
ORDER BY TZNAME ASC;

Ecco come sono ora le prime 10 righe:

               TZNAME 
_____________________ 
Africa/Abidjan        
Africa/Accra          
Africa/Addis_Ababa    
Africa/Algiers        
Africa/Asmara         
Africa/Asmera         
Africa/Bamako         
Africa/Bangui         
Africa/Banjul         
Africa/Bissau         
...

Ottieni tutte le abbreviazioni per un determinato nome di fuso orario

Ecco un esempio di query che restituisce tutte le abbreviazioni per un determinato nome di fuso orario:

SELECT 
    TZNAME,
    TZABBREV
FROM V$TIMEZONE_NAMES
WHERE TZNAME LIKE '%Sydney%'
ORDER BY TZNAME ASC;

Risultato:

             TZNAME    TZABBREV 
___________________ ___________ 
Australia/Sydney    LMT         
Australia/Sydney    AEDT        
Australia/Sydney    AEST        

Informazioni sui file di fuso orario

In Oracle Database, i nomi dei fusi orari sono contenuti nei file dei fusi orari.

Puoi interrogare il V$TIMEZONE_FILE visualizza per vedere quale file di fuso orario è attualmente utilizzato dal database.

Esempio:

SELECT * FROM V$TIMEZONE_FILE;

Risultato:

          FILENAME    VERSION    CON_ID 
__________________ __________ _________ 
timezlrg_32.dat            32         0 

Il mio sistema utilizza la versione 32, che è il file di fuso orario predefinito per Oracle 19c (che è quello che sto usando). Questo file si trova nella seguente posizione:$ORACLE_HOME/oracore/zoneinfo/timezlrg_32.dat

Consulta la documentazione di Oracle per la scelta di un file di fuso orario per ulteriori informazioni sui file di fuso orario.