W Oracle Database strefy czasowe można ustawić w różnych miejscach. Poniżej znajdują się cztery sposoby zmiany strefy czasowej podczas korzystania z Oracle.
Ustaw strefę czasową bazy danych
Strefę czasową bazy danych można ustawić podczas tworzenia bazy danych. Aby to zrobić, użyj SET TIME_ZONE
klauzula CREATE DATABASE
oświadczenie.
Przykład:
CREATE DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';
W tym przypadku użyłem nazwy regionu strefy czasowej. Zobacz Jak zwrócić listę prawidłowych stref czasowych w bazie danych Oracle, aby uzyskać pełną listę prawidłowych nazw regionów w systemie.
Alternatywnie możesz użyć rzeczywistego przesunięcia strefy czasowej:
CREATE DATABASE mySampleDb
...
SET TIME_ZONE='+10:00';
Jeśli nie ustawisz wyraźnie strefy czasowej podczas tworzenia bazy danych, domyślnie jest to strefa czasowa systemu operacyjnego serwera.
Możesz także zmienić bieżące ustawienie strefy czasowej dla bazy danych. Aby to zrobić, użyj ALTER DATABASE
oświadczenie.
Przykład:
ALTER DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';
Zwróć uwagę, że strefa czasowa bazy danych dotyczy tylko TIMESTAMP WITH LOCAL TIME ZONE
kolumny. Ponadto firma Oracle zaleca ustawienie strefy czasowej bazy danych na UTC (0:00), aby uniknąć konwersji danych i poprawić wydajność podczas przesyłania danych między bazami danych.
Ustaw strefę czasową sesji
Strefę czasową sesji można ustawić niezależnie od strefy czasowej bazy danych. Po zwróceniu TIMESTAMP WITH LOCAL TIME ZONE
dane, są zwracane w strefie czasowej bieżącej sesji.
Strefa czasowa sesji działa również, gdy TIMESTAMP
wartość jest konwertowana na TIMESTAMP WITH TIME ZONE
lub TIMESTAMP WITH LOCAL TIME ZONE
typ danych.
Możesz zrobić kilka rzeczy, aby ustawić strefę czasową na poziomie sesji.
Ton ORA_SDTZ
Zmienna środowiskowa
Możesz ustawić strefę czasową sesji za pomocą ORA_SDTZ
Zmienna środowiskowa. Można to ustawić na następujące wartości:
- Lokalna strefa czasowa systemu operacyjnego (
'OS_TZ'
) - Strefa czasowa bazy danych (
'DB_TZ'
) - Przesunięcie absolutne względem czasu UTC (np.
'-04:00'
) - Nazwa regionu strefy czasowej (np.
'America/St_Kitts'
)
Oto kilka przykładów ustawienia tej zmiennej środowiskowej w środowisku UNIX:
% setenv ORA_SDTZ 'OS_TZ'
% setenv ORA_SDTZ 'DB_TZ'
% setenv ORA_SDTZ 'America/St_Kitts'
% setenv ORA_SDTZ '-04:00'
Domyślna wartość ORA_SDTZ
zmienna to 'OD_TZ'
. Ta wartość jest używana, gdy zmienna nie jest ustawiona lub jest ustawiona na nieprawidłową wartość.
ALTER SESSION
Oświadczenie
Możesz zmienić strefę czasową dla określonej sesji SQL za pomocą SET TIME_ZONE
klauzula ALTER SESSION
oświadczenie.
TIME_ZONE
można ustawić na następujące wartości:
- Domyślna lokalna strefa czasowa, kiedy sesja została uruchomiona (
local
) - Strefa czasowa bazy danych (
dbtimezone
) - Przesunięcie absolutne względem czasu UTC (np.
'-04:00'
) - Nazwa regionu strefy czasowej (np.
'Canada/Eastern'
)
Oto przykład ustawienia TIME_ZONE
do takich wartości:
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';
Strefę czasową bieżącej sesji możesz sprawdzić za pomocą SESSIONTIMEZONE
funkcja.
Przykład:
SELECT SESSIONTIMEZONE FROM DUAL;
Wynik:
Australia/Brisbane
W moim przypadku strefa czasowa sesji jest ustawiona na Australia/Brisbane.
Strefa AT TIME ZONE
Klauzula
Wyrażenie daty i godziny może zawierać AT LOCAL
klauzula lub AT TIME ZONE
klauzula. Jeśli dołączysz AT LOCAL
klauzula, wynik jest zwracany w strefie czasowej bieżącej sesji. Jeśli uwzględnisz AT TIME ZONE
klauzuli, strefa czasowa może być jedną z następujących:
- Przesunięcie strefy czasowej
- Nazwa regionu strefy czasowej
DBTIMEZONE
(ta funkcja zwraca strefę czasową bazy danych)SESSIONTIMEZONE
(ta funkcja zwraca strefę czasową bieżącej sesji)- Wyrażenie, które zwraca ciąg znaków z prawidłowym formatem strefy czasowej.
Przykład:
SELECT
FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00')
AT TIME ZONE '+12:00'
FROM DUAL;
Wynik:
02/JAN/30 04:30:35.000000000 AM +12:00
W tym przypadku użyłem FROM_TZ()
funkcja do konwersji wartości znacznika czasu i strefy czasowej na TIMESTAMP WITH TIME ZONE
wartość. Następnie użyłem AT TIME ZONE
klauzula, aby określić inną strefę czasową.
Oto ten sam przykład, ale tym razem określam AT LOCAL
:
SELECT
FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00')
AT LOCAL
FROM DUAL;
Wynik:
02/JAN/30 02:30:35.000000000 AM AUSTRALIA/BRISBANE