В данной статье приведена информация по теме работы с текущим временем и датами в различных временных зонах.
В базе данных Oracle имеются встроенные функции работы со временем в следующих часовых поясах.
1. Часовой пояс сессии/клиента
Текущее значение часового пояса сессии/клиента содержится в SESSIONTIMEZONE.
select SESSIONTIMEZONE from dual;
Это значение может быть изменено командой ниже.
ALTER SESSION SET TIME_ZONE='Europe/Paris';
В качестве SESSIONTIMEZONE может быть установлено одно из следующих значений:
- Значение временной зоны ОС ('OS_TZ')
- Значение временной зоны базы данных ('DB_TZ')
- Смещение временной зоны от UTC (например, '-05:00')
- Имя временной зоны (например, 'Europe/Minsk')
Для получения текущего времени в часовом поясе сессии используются переменные CURRENT_DATE, LOCALTIMESTAMP, CURRENT_TIMESTAMP.
select CURRENT_DATE from dual; select LOCALTIMESTAMP from dual; select CURRENT_TIMESTAMP from dual;
Они отличаются друг от друга возвращаемым типом:
CURRENT_DATE возвращает DATE, LOCALTIMESTAMP - TIMESTAMP и CURRENT_TIMESTAMP - TIMESTAMP WITH TIME ZONE
2. Часовой пояс базы данных
Текущее значение часового пояса базы данных содержится в DBTIMEZONE.
select DBTIMEZONE from dual;
Это значение используется для внутреннего хранения полей типа TIMESTAMP WITH LOCAL TIME ZONE. Такие поля преобразуются в/из часового пояса сессии при select/insert действиях, поэтому на самом деле значение DBTIMEZONE не имеет большой важности.
Это не часовой пояс переменных SYSDATE и SYSTIMESTAMP.
3. Часовой пояс операционной системы базы данных
Можно посмотреть используя переменную TZR.
select TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI TZR') from dual;
Для получения текущего времени в этом часовом поясе используются переменные SYSDATE и SYSTIMESTAMP.
select SYSDATE from dual; select SYSTIMESTAMP from dual;
4. Часовой пояс UTC
В Oracle существет специальная функция sys_extract_utc для преобразования любого значения таймстампа в часовой пояс UTC. Ниже приведены разные варианты её использования.
select sys_extract_utc(systimestamp) from dual; select cast(sys_extract_utc(systimestamp) as date) from dual; select sys_extract_utc(timestamp '2000-03-28 11:30:00.00 -08:00') from dual;
Комментариев нет:
Отправить комментарий