I Oracle Database kan tidszoner ställas in på olika platser. Nedan finns fyra sätt att ändra tidszonen när du använder Oracle.
Ställ in databasens tidszon
Du kan ställa in databasens tidszon när du skapar databasen. För att göra detta, använd SET TIME_ZONE
satsen i CREATE DATABASE
uttalande.
Exempel:
CREATE DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';
I det här fallet använde jag ett tidszonsregionsnamn. Se Hur man returnerar en lista med giltiga tidszoner i Oracle Database för att få en fullständig lista över giltiga regionnamn på ditt system.
Alternativt kan du använda en faktisk tidszonförskjutning:
CREATE DATABASE mySampleDb
...
SET TIME_ZONE='+10:00';
Om du inte uttryckligen ställer in tidszonen när du skapar databasen, är den som standard tidszonen för serverns operativsystem.
Du kan också ändra den aktuella tidszonsinställningen för databasen. För att göra detta, använd ALTER DATABASE
uttalande.
Exempel:
ALTER DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';
Observera att databasens tidszon endast är relevant för TIMESTAMP WITH LOCAL TIME ZONE
kolumner. Oracle rekommenderar också att du ställer in databasens tidszon till UTC (0:00) för att undvika datakonvertering och förbättra prestandan när data överförs mellan databaser.
Ställ in sessionens tidszon
Du kan ställa in sessionens tidszon oberoende av databasens tidszon. När du returnerar TIMESTAMP WITH LOCAL TIME ZONE
data, returneras den i den aktuella sessionens tidszon.
Sessionens tidszon träder också i kraft när en TIMESTAMP
värdet konverteras till TIMESTAMP WITH TIME ZONE
eller TIMESTAMP WITH LOCAL TIME ZONE
datatyp.
Du kan göra ett par saker för att ställa in tidszonen på sessionsnivå.
The ORA_SDTZ
Miljövariabel
Du kan ställa in sessionens tidszon med ORA_SDTZ
miljöfaktor. Detta kan ställas in på följande värden:
- Operativsystemets lokala tidszon (
'OS_TZ'
) - Databasens tidszon (
'DB_TZ'
) - Absolut offset från UTC (t.ex.
'-04:00'
) - Tidszonens regionnamn (t.ex.
'America/St_Kitts'
)
Här är några exempel på hur den här miljövariabeln ställs in i en UNIX-miljö:
% setenv ORA_SDTZ 'OS_TZ'
% setenv ORA_SDTZ 'DB_TZ'
% setenv ORA_SDTZ 'America/St_Kitts'
% setenv ORA_SDTZ '-04:00'
Standardvärdet för ORA_SDTZ
variabeln är 'OD_TZ'
. Detta värde används när variabeln inte är inställd eller om den är inställd på ett ogiltigt värde.
ALTER SESSION
Uttalande
Du kan ändra tidszonen för en specifik SQL-session med SET TIME_ZONE
sats i ALTER SESSION
uttalande.
TIME_ZONE
kan ställas in på följande värden:
- Standard lokal tidszon när sessionen startade (
local
) - Databasens tidszon (
dbtimezone
) - Absolut offset från UTC (t.ex.
'-04:00'
) - Tidszonsregionens namn (t.ex.
'Canada/Eastern'
)
Här är ett exempel på inställning av TIME_ZONE
till sådana värden:
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 kontrollera din nuvarande sessions tidszon med SESSIONTIMEZONE
funktion.
Exempel:
SELECT SESSIONTIMEZONE FROM DUAL;
Resultat:
Australia/Brisbane
I mitt fall är sessionens tidszon inställd på Australien/Brisbane.
AT TIME ZONE
Klausul
Ett datetime-uttryck kan innehålla en AT LOCAL
sats eller en AT TIME ZONE
klausul. Om du inkluderar en AT LOCAL
klausul, då returneras resultatet i den aktuella sessionens tidszon. Om du inkluderar AT TIME ZONE
klausul, då kan tidszonen vara en av följande:
- En tidszonsförskjutning
- Ett tidszonsregionsnamn
DBTIMEZONE
(denna funktion returnerar tidszonen för databasen)SESSIONTIMEZONE
(denna funktion returnerar tidszonen för den aktuella sessionen)- Ett uttryck som returnerar en teckensträng med ett giltigt tidszonsformat.
Exempel:
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 det här fallet använde jag FROM_TZ()
funktion för att konvertera ett tidsstämpelvärde och en tidszon till en TIMESTAMP WITH TIME ZONE
värde. Jag använde sedan AT TIME ZONE
klausul för att ange en annan tidszon.
Här är samma exempel, förutom den här gången anger jag 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