В Oracle Database часовите зони могат да се задават на различни места. По-долу са изброени четири начина за промяна на часовата зона, когато използвате Oracle.
Задайте часовата зона на базата данни
Можете да зададете часовата зона на базата данни, когато създавате базата данни. За да направите това, използвайте SET TIME_ZONE
клауза на CREATE DATABASE
изявление.
Пример:
CREATE DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';
В този случай използвах име на региона на часовата зона. Вижте как да върнете списък с валидни часови зони в Oracle Database, за да получите пълен списък с валидни имена на региони във вашата система.
Като алтернатива можете да използвате действително изместване на часовата зона:
CREATE DATABASE mySampleDb
...
SET TIME_ZONE='+10:00';
Ако не зададете изрично часовата зона при създаването на базата данни, тогава тя по подразбиране е часовата зона на операционната система на сървъра.
Можете също да промените текущата настройка на часовата зона за базата данни. За да направите това, използвайте ALTER DATABASE
изявление.
Пример:
ALTER DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';
Имайте предвид, че часовата зона на базата данни е от значение само за TIMESTAMP WITH LOCAL TIME ZONE
колони. Освен това Oracle препоръчва да зададете часовата зона на базата данни на UTC (0:00), за да избегнете преобразуването на данни и да подобрите производителността, когато данните се прехвърлят между бази данни.
Задайте часовата зона на сесията
Можете да зададете часовата зона на сесията независимо от часовата зона на базата данни. Когато върнете TIMESTAMP WITH LOCAL TIME ZONE
данни, те се връщат в часовата зона на текущата сесия.
Часовата зона на сесията също влиза в сила, когато TIMESTAMP
стойността се преобразува в TIMESTAMP WITH TIME ZONE
или TIMESTAMP WITH LOCAL TIME ZONE
тип данни.
Можете да направите няколко неща, за да зададете часовата зона на ниво сесия.
Tтой ORA_SDTZ
Променлива на средата
Можете да зададете часовата зона на сесията с ORA_SDTZ
променлива на средата. Това може да бъде зададено на следните стойности:
- Локална часова зона на операционната система (
'OS_TZ'
). ) - Часова зона на базата данни (
'DB_TZ'
). ) - Абсолютно изместване спрямо UTC (напр.
'-04:00'
) - Име на региона на часовата зона (напр.
'America/St_Kitts'
)
Ето няколко примера за настройка на тази променлива на средата в UNIX среда:
% setenv ORA_SDTZ 'OS_TZ'
% setenv ORA_SDTZ 'DB_TZ'
% setenv ORA_SDTZ 'America/St_Kitts'
% setenv ORA_SDTZ '-04:00'
Стойността по подразбиране на ORA_SDTZ
променливата е 'OD_TZ'
. Тази стойност се използва, когато променливата не е зададена или е зададена на невалидна стойност.
ALTER SESSION
Изявление
Можете да промените часовата зона за конкретна SQL сесия с SET TIME_ZONE
клауза на ALTER SESSION
изявление.
TIME_ZONE
могат да бъдат зададени на следните стойности:
- Местна часова зона по подразбиране при стартиране на сесията (
local
) - Часова зона на базата данни (
dbtimezone
) - Абсолютно изместване спрямо UTC (напр.
'-04:00'
) - Име на региона на часовата зона (напр.
'Canada/Eastern'
)
Ето пример за настройка на TIME_ZONE
до такива стойности:
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';
Можете да проверите часовата зона на текущата си сесия с SESSIONTIMEZONE
функция.
Пример:
SELECT SESSIONTIMEZONE FROM DUAL;
Резултат:
Australia/Brisbane
В моя случай часовата зона на сесията е настроена на Австралия/Брисбейн.
AT TIME ZONE
Клауза
Изразът за дата и час може да включва AT LOCAL
клауза или AT TIME ZONE
клауза. Ако включите AT LOCAL
клауза, тогава резултатът се връща в часова зона на текущата сесия. Ако включите AT TIME ZONE
клауза, тогава часовата зона може да бъде една от следните:
- Изместване на часовата зона
- Име на региона на часовата зона
DBTIMEZONE
(тази функция връща часовата зона на базата данни)SESSIONTIMEZONE
(тази функция връща часовата зона на текущата сесия)- Израз, който връща символен низ с валиден формат на часовата зона.
Пример:
SELECT
FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00')
AT TIME ZONE '+12:00'
FROM DUAL;
Резултат:
02/JAN/30 04:30:35.000000000 AM +12:00
В този случай използвах FROM_TZ()
функция за преобразуване на стойност на времеви печат и часова зона в TIMESTAMP WITH TIME ZONE
стойност. След това използвах AT TIME ZONE
клауза, за да посочите различна часова зона.
Ето същия пример, освен че този път указвам AT LOCAL
:
SELECT
FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00')
AT LOCAL
FROM DUAL;
Резултат:
02/JAN/30 02:30:35.000000000 AM AUSTRALIA/BRISBANE