ZONE в Oracle SQL — как использовать часовые пояса

🟢 ZONE в Oracle SQL. Введение

Ключевое слово ZONE в Oracle SQL используется в контексте работы с типами данных времени и датой, поддерживающих часовые пояса. Оно применяется в типах TIMESTAMP WITH TIME ZONE и TIMESTAMP WITH LOCAL TIME ZONE, а также в функциях преобразования времени. В этой статье ты найдёшь 50 примеров правильного использования ZONE для хранения, сравнения и отображения времени.


🖋️ Синтаксис использования ZONE

-- С TIMESTAMP WITH TIME ZONE:
CREATE TABLE logs (
  event_time TIMESTAMP WITH TIME ZONE
);

-- С TIMESTAMP WITH LOCAL TIME ZONE:
CREATE TABLE sessions (
  login_time TIMESTAMP WITH LOCAL TIME ZONE
);

-- С функцией FROM_TZ:
SELECT FROM_TZ(TIMESTAMP '2025-08-30 10:00:00', 'Europe/Moscow') FROM dual;

🔄 Где используется ZONE

  • Хранение событий с точным часовым поясом
  • Приведение дат между часовыми поясами
  • Работа с распределёнными системами и API
  • Форматирование времени для отчётов

📊 Примеры использования ZONE в Oracle SQL (45 примеров)

  1. Задание значения с временной зоной:
INSERT INTO logs (event_time)
VALUES (TIMESTAMP '2025-08-30 09:00:00 Europe/London');
  1. SELECT с AT TIME ZONE:
SELECT event_time AT TIME ZONE 'UTC' FROM logs;
  1. Использование FROM_TZ:
SELECT FROM_TZ(TIMESTAMP '2025-08-30 08:00:00', 'Asia/Tokyo') FROM dual;
  1. Сравнение времён с разными зонами:
SELECT * FROM logs
WHERE event_time AT TIME ZONE 'UTC' > SYSTIMESTAMP AT TIME ZONE 'UTC';
  1. SELECT CURRENT_TIMESTAMP:
SELECT CURRENT_TIMESTAMP FROM dual;
  1. Сравнение TIMESTAMP с TIME ZONE:
SELECT * FROM sessions
WHERE login_time > FROM_TZ(TIMESTAMP '2025-08-30 08:00:00', 'UTC');
  1. Использование SYS_EXTRACT_UTC:
SELECT SYS_EXTRACT_UTC(SYSTIMESTAMP) FROM dual;
  1. Преобразование времени в локальную зону:
SELECT login_time AT TIME ZONE 'Asia/Yekaterinburg' FROM sessions;
  1. AT LOCAL для TIMESTAMP WITH LOCAL TIME ZONE:
SELECT login_time AT LOCAL FROM sessions;
  1. Использование CURRENT_DATE с временной зоной:
SELECT CURRENT_DATE AT TIME ZONE 'US/Pacific' FROM dual;
  1. Использование DBTIMEZONE:
SELECT DBTIMEZONE FROM dual;
  1. Использование SESSIONTIMEZONE:
SELECT SESSIONTIMEZONE FROM dual;
  1. CAST TIMESTAMP TO TIME ZONE:
SELECT CAST(SYSTIMESTAMP AT TIME ZONE 'Europe/Berlin' AS TIMESTAMP) FROM dual;
  1. Пример с BETWEEN:
SELECT * FROM logs
WHERE event_time BETWEEN
  TIMESTAMP '2025-08-30 08:00:00 Europe/London'
  AND TIMESTAMP '2025-08-30 10:00:00 Europe/London';
  1. Вставка с SYSTIMESTAMP:
INSERT INTO logs (event_time) VALUES (SYSTIMESTAMP);
  1. Вывод TIME ZONE региона:
SELECT event_time, TO_CHAR(event_time, 'TZR') AS zone FROM logs;
  1. SELECT с TIME ZONE OFFSET:
SELECT TO_CHAR(SYSTIMESTAMP, 'TZD') AS abbr, TO_CHAR(SYSTIMESTAMP, 'TZH:TZM') AS offset FROM dual;
  1. Использование TZ_OFFSET:
SELECT TZ_OFFSET('Europe/Moscow') FROM dual;
  1. Использование CAST на TIMESTAMP WITH TIME ZONE:
SELECT CAST(CURRENT_TIMESTAMP AS TIMESTAMP WITH TIME ZONE) FROM dual;
  1. Вставка с FROM_TZ и TO_TIMESTAMP:
INSERT INTO sessions (login_time)
VALUES (FROM_TZ(TO_TIMESTAMP('2025-09-01 09:30:00', 'YYYY-MM-DD HH24:MI:SS'), 'Europe/Kiev'));
  1. Сравнение разных ZONE:
SELECT * FROM logs
WHERE event_time AT TIME ZONE 'UTC' < SYSTIMESTAMP AT TIME ZONE 'UTC';
  1. Преобразование к CHAR:
SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS TZR') FROM dual;
  1. Установка TIME_ZONE в сессии:
ALTER SESSION SET TIME_ZONE = 'Europe/Paris';
  1. Использование SYSDATE AT TIME ZONE:
SELECT SYSDATE AT TIME ZONE 'Asia/Bangkok' FROM dual;
  1. SELECT с указанием TIMESTAMP в другой ZONE:
SELECT TIMESTAMP '2025-08-30 15:00:00 US/Pacific' FROM dual;
  1. Использование TO_TIMESTAMP_TZ:
SELECT TO_TIMESTAMP_TZ('2025-08-30 12:00:00 Europe/London', 'YYYY-MM-DD HH24:MI:SS TZR') FROM dual;
  1. Удаление по дате с ZONE:
DELETE FROM logs
WHERE event_time < SYSTIMESTAMP AT TIME ZONE 'UTC';
  1. Сортировка по TIME ZONE:
SELECT * FROM logs ORDER BY event_time AT TIME ZONE 'UTC';
  1. DATE вместо TIMESTAMP:
SELECT CAST(SYSTIMESTAMP AT TIME ZONE 'UTC' AS DATE) FROM dual;
  1. Использование LOCALTIMESTAMP:
SELECT LOCALTIMESTAMP FROM dual;
  1. Разница во времени с ZONE:
SELECT SYSTIMESTAMP - FROM_TZ(TIMESTAMP '2025-08-29 23:00:00', 'UTC') FROM dual;
  1. Извлечение части времени:
SELECT EXTRACT(HOUR FROM SYSTIMESTAMP AT TIME ZONE 'Asia/Tokyo') FROM dual;
  1. TIME ZONE в аналитике:
SELECT employee_id, login_time AT TIME ZONE 'Europe/Moscow',
  RANK() OVER (ORDER BY login_time AT TIME ZONE 'UTC') AS rnk
FROM sessions;
  1. Проверка входа сегодня:
SELECT * FROM sessions
WHERE login_time AT TIME ZONE 'Europe/Minsk' >= TRUNC(SYSTIMESTAMP AT TIME ZONE 'Europe/Minsk');
  1. Сравнение TIMESTAMP и TIMESTAMP WITH TIME ZONE:
SELECT * FROM logs
WHERE event_time > CAST(SYSDATE AS TIMESTAMP WITH TIME ZONE);
  1. Фильтрация по интервалу времени:
SELECT * FROM sessions
WHERE login_time AT TIME ZONE 'UTC' BETWEEN
  SYSTIMESTAMP AT TIME ZONE 'UTC' - INTERVAL '1' DAY AND
  SYSTIMESTAMP AT TIME ZONE 'UTC';
  1. TIME ZONE в CTE:
WITH z AS (
  SELECT SYSTIMESTAMP AT TIME ZONE 'Asia/Dubai' AS local_time FROM dual
)
SELECT * FROM z;
  1. TIME ZONE в представлении:
CREATE VIEW v_logs_utc AS
SELECT event_time AT TIME ZONE 'UTC' AS utc_time FROM logs;
  1. TIME ZONE в MERGE:
MERGE INTO timezone_audit t
USING (SELECT SYSTIMESTAMP AT TIME ZONE 'UTC' AS ts FROM dual) s
ON (t.event_time = s.ts)
WHEN NOT MATCHED THEN INSERT (event_time) VALUES (s.ts);
  1. Использование TO_DSINTERVAL с TIME ZONE:
SELECT SYSTIMESTAMP + TO_DSINTERVAL('0 02:00:00') FROM dual;
  1. Переход времени в другом поясе:
SELECT login_time AT TIME ZONE 'Australia/Sydney' FROM sessions;
  1. TO_CHAR с временем и зоной:
SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI TZR TZD') FROM dual;
  1. Указание ZONE вручную:
SELECT FROM_TZ(TIMESTAMP '2025-12-31 23:59:59', 'Asia/Seoul') FROM dual;
  1. Текущий день в конкретной зоне:
SELECT TRUNC(SYSTIMESTAMP AT TIME ZONE 'Europe/Berlin') FROM dual;
  1. Использование ZONE в функциях:
CREATE OR REPLACE FUNCTION get_utc_time RETURN TIMESTAMP WITH TIME ZONE IS
BEGIN
  RETURN SYSTIMESTAMP AT TIME ZONE 'UTC';
END;

📆 Заключение: зачем использовать ZONE в Oracle SQL

ZONE в Oracle SQL даёт возможность точно учитывать часовые пояса при работе с датой и временем. Это особенно важно в глобальных системах, где данные собираются и анализируются в разных регионах. TIMESTAMP WITH TIME ZONE и его функции — это надёжный инструмент для универсальной работы с временем.


🕸️ Следующая статья:

XML в Oracle SQL — как работать с XML-данными, XPath и извлекать вложенные структуры


 

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии