V databázi Oracle lze časová pásma nastavit na různých místech. Níže jsou uvedeny čtyři způsoby, jak změnit časové pásmo při používání Oracle.
Nastavte časové pásmo databáze
Časové pásmo databáze můžete nastavit při vytváření databáze. Chcete-li to provést, použijte SET TIME_ZONE
klauzule CREATE DATABASE
prohlášení.
Příklad:
CREATE DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';
V tomto případě jsem použil název oblasti časového pásma. Úplný seznam platných názvů oblastí ve vašem systému naleznete v části Jak vrátit seznam platných časových pásem v databázi Oracle.
Případně můžete použít skutečný posun časového pásma:
CREATE DATABASE mySampleDb
...
SET TIME_ZONE='+10:00';
Pokud při vytváření databáze explicitně nenastavíte časové pásmo, použije se jako výchozí časové pásmo operačního systému serveru.
Můžete také změnit aktuální nastavení časového pásma pro databázi. K tomu použijte ALTER DATABASE
prohlášení.
Příklad:
ALTER DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';
Upozorňujeme, že časové pásmo databáze je relevantní pouze pro TIMESTAMP WITH LOCAL TIME ZONE
sloupců. Společnost Oracle také doporučuje nastavit časové pásmo databáze na UTC (0:00), abyste zabránili konverzi dat a zlepšili výkon při přenosu dat mezi databázemi.
Nastavte časové pásmo relace
Časové pásmo relace můžete nastavit nezávisle na časovém pásmu databáze. Když vrátíte TIMESTAMP WITH LOCAL TIME ZONE
data, vrátí se v časovém pásmu aktuální relace.
Časové pásmo relace se projeví také při TIMESTAMP
hodnota se převede na TIMESTAMP WITH TIME ZONE
nebo TIMESTAMP WITH LOCAL TIME ZONE
datový typ.
Chcete-li nastavit časové pásmo na úrovni relace, můžete provést několik věcí.
The ORA_SDTZ
Proměnná prostředí
Časové pásmo relace můžete nastavit pomocí ORA_SDTZ
proměnná prostředí. To lze nastavit na následující hodnoty:
- Místní časové pásmo operačního systému (
'OS_TZ'
) - Časové pásmo databáze (
'DB_TZ'
) - Absolutní odchylka od UTC (např.
'-04:00'
) - Název oblasti časového pásma (např.
'America/St_Kitts'
)
Zde je několik příkladů nastavení této proměnné prostředí v prostředí UNIX:
% setenv ORA_SDTZ 'OS_TZ'
% setenv ORA_SDTZ 'DB_TZ'
% setenv ORA_SDTZ 'America/St_Kitts'
% setenv ORA_SDTZ '-04:00'
Výchozí hodnota ORA_SDTZ
proměnná je 'OD_TZ'
. Tato hodnota se používá, když proměnná není nastavena nebo je nastavena na neplatnou hodnotu.
ALTER SESSION
Prohlášení
Časové pásmo pro konkrétní relaci SQL můžete změnit pomocí SET TIME_ZONE
klauzule ALTER SESSION
prohlášení.
TIME_ZONE
lze nastavit na následující hodnoty:
- Výchozí místní časové pásmo při zahájení relace (
local
) - Časové pásmo databáze (
dbtimezone
) - Absolutní odchylka od UTC (např.
'-04:00'
) - Název oblasti časového pásma (např.
'Canada/Eastern'
)
Zde je příklad nastavení TIME_ZONE
na tyto hodnoty:
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';
Časové pásmo aktuální relace můžete zkontrolovat pomocí SESSIONTIMEZONE
funkce.
Příklad:
SELECT SESSIONTIMEZONE FROM DUAL;
Výsledek:
Australia/Brisbane
V mém případě je časové pásmo relace nastaveno na Austrálie/Brisbane.
AT TIME ZONE
Ustanovení
Výraz datum a čas může obsahovat AT LOCAL
klauzule nebo AT TIME ZONE
doložka. Pokud zahrnete AT LOCAL
klauzule, pak je výsledek vrácen v aktuálním časovém pásmu relace. Pokud zahrnete AT TIME ZONE
klauzule, pak může být časové pásmo jedno z následujících:
- Posun časového pásma
- Název oblasti časového pásma
DBTIMEZONE
(tato funkce vrací časové pásmo databáze)SESSIONTIMEZONE
(tato funkce vrací časové pásmo aktuální relace)- Výraz, který vrací řetězec znaků s platným formátem časového pásma.
Příklad:
SELECT
FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00')
AT TIME ZONE '+12:00'
FROM DUAL;
Výsledek:
02/JAN/30 04:30:35.000000000 AM +12:00
V tomto případě jsem použil FROM_TZ()
funkce pro převod hodnoty časového razítka a časového pásma na TIMESTAMP WITH TIME ZONE
hodnota. Potom jsem použil AT TIME ZONE
klauzule k určení jiného časového pásma.
Zde je stejný příklad, ale tentokrát uvádím AT LOCAL
:
SELECT
FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00')
AT LOCAL
FROM DUAL;
Výsledek:
02/JAN/30 02:30:35.000000000 AM AUSTRALIA/BRISBANE