I Oracle Database kan tidszoner indstilles forskellige steder. Nedenfor er fire måder at ændre tidszonen på, når du bruger Oracle.
Indstil databasens tidszone
Du kan indstille databasens tidszone, når du opretter databasen. For at gøre dette skal du bruge SET TIME_ZONE
klausul i CREATE DATABASE
erklæring.
Eksempel:
CREATE DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';
I dette tilfælde brugte jeg et tidszoneområdenavn. Se, hvordan du returnerer en liste over gyldige tidszoner i Oracle-databasen for at få en komplet liste over gyldige regionsnavne på dit system.
Alternativt kan du bruge en faktisk tidszoneforskydning:
CREATE DATABASE mySampleDb
...
SET TIME_ZONE='+10:00';
Hvis du ikke udtrykkeligt angiver tidszonen, når du opretter databasen, vil den som standard være tidszonen for serverens operativsystem.
Du kan også ændre den aktuelle tidszoneindstilling for databasen. For at gøre dette skal du bruge ALTER DATABASE
erklæring.
Eksempel:
ALTER DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';
Bemærk, at databasens tidszone kun er relevant for TIMESTAMP WITH LOCAL TIME ZONE
kolonner. Oracle anbefaler også, at du indstiller databasens tidszone til UTC (0:00) for at undgå datakonvertering og forbedre ydeevnen, når data overføres mellem databaser.
Indstil sessionens tidszone
Du kan indstille sessionens tidszone uafhængigt af databasens tidszone. Når du returnerer TIMESTAMP WITH LOCAL TIME ZONE
data, returneres det i den aktuelle sessions tidszone.
Sessionens tidszone træder også i kraft, når en TIMESTAMP
værdien konverteres til TIMESTAMP WITH TIME ZONE
eller TIMESTAMP WITH LOCAL TIME ZONE
datatype.
Du kan gøre et par ting for at indstille tidszonen på sessionsniveau.
Than ORA_SDTZ
Miljøvariabel
Du kan indstille sessionens tidszone med ORA_SDTZ
miljøvariabel. Dette kan indstilles til følgende værdier:
- Operativsystemets lokale tidszone (
'OS_TZ'
) - Databasens tidszone (
'DB_TZ'
) - Absolut offset fra UTC (f.eks.
'-04:00'
) - Tidszoneregionsnavn (f.eks.
'America/St_Kitts'
)
Her er nogle eksempler på indstilling af denne miljøvariabel i et UNIX-miljø:
% setenv ORA_SDTZ 'OS_TZ'
% setenv ORA_SDTZ 'DB_TZ'
% setenv ORA_SDTZ 'America/St_Kitts'
% setenv ORA_SDTZ '-04:00'
Standardværdien for ORA_SDTZ
variabel er 'OD_TZ'
. Denne værdi bruges, når variablen ikke er indstillet, eller den er indstillet til en ugyldig værdi.
ALTER SESSION
Erklæring
Du kan ændre tidszonen for en specifik SQL-session med SET TIME_ZONE
klausul i ALTER SESSION
erklæring.
TIME_ZONE
kan indstilles til følgende værdier:
- Standard lokal tidszone, da sessionen blev startet (
local
) - Databasens tidszone (
dbtimezone
) - Absolut offset fra UTC (f.eks.
'-04:00'
) - Tidszoneregionsnavn (f.eks.
'Canada/Eastern'
)
Her er et eksempel på indstilling af TIME_ZONE
til sådanne værdier:
ALTER SESSION SET TIME_ZONE=local;
ALTER SESSION SET TIME_ZONE=dbtimezone;
ALTER SESSION SET TIME_ZONE='Canada/Eastern';
ALTER SESSION SET TIME_ZONE='-04:00';
Du kan tjekke din aktuelle sessions tidszone med SESSIONTIMEZONE
funktion.
Eksempel:
SELECT SESSIONTIMEZONE FROM DUAL;
Resultat:
Australia/Brisbane
I mit tilfælde er sessionens tidszone indstillet til Australien/Brisbane.
AT TIME ZONE
Klausul
Et datetime-udtryk kan indeholde en AT LOCAL
klausul eller en AT TIME ZONE
klausul. Hvis du inkluderer en AT LOCAL
klausul, så returneres resultatet i den aktuelle sessions tidszone. Hvis du inkluderer AT TIME ZONE
klausul, så kan tidszonen være en af følgende:
- En tidszoneforskydning
- Et tidszoneområdenavn
DBTIMEZONE
(denne funktion returnerer databasens tidszone)SESSIONTIMEZONE
(denne funktion returnerer tidszonen for den aktuelle session)- Et udtryk, der returnerer en tegnstreng med et gyldigt tidszoneformat.
Eksempel:
SELECT
FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00')
AT TIME ZONE '+12:00'
FROM DUAL;
Resultat:
02/JAN/30 04:30:35.000000000 AM +12:00
I dette tilfælde brugte jeg FROM_TZ()
funktion til at konvertere en tidsstempelværdi og en tidszone til et TIMESTAMP WITH TIME ZONE
værdi. Jeg brugte derefter AT TIME ZONE
klausul for at angive en anden tidszone.
Her er det samme eksempel, bortset fra at denne gang angiver jeg AT LOCAL
:
SELECT
FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00')
AT LOCAL
FROM DUAL;
Resultat:
02/JAN/30 02:30:35.000000000 AM AUSTRALIA/BRISBANE