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 примеров)
- Задание значения с временной зоной:
INSERT INTO logs (event_time)
VALUES (TIMESTAMP '2025-08-30 09:00:00 Europe/London');
- SELECT с AT TIME ZONE:
SELECT event_time AT TIME ZONE 'UTC' FROM logs;
- Использование FROM_TZ:
SELECT FROM_TZ(TIMESTAMP '2025-08-30 08:00:00', 'Asia/Tokyo') FROM dual;
- Сравнение времён с разными зонами:
SELECT * FROM logs
WHERE event_time AT TIME ZONE 'UTC' > SYSTIMESTAMP AT TIME ZONE 'UTC';
- SELECT CURRENT_TIMESTAMP:
SELECT CURRENT_TIMESTAMP FROM dual;
- Сравнение TIMESTAMP с TIME ZONE:
SELECT * FROM sessions
WHERE login_time > FROM_TZ(TIMESTAMP '2025-08-30 08:00:00', 'UTC');
- Использование SYS_EXTRACT_UTC:
SELECT SYS_EXTRACT_UTC(SYSTIMESTAMP) FROM dual;
- Преобразование времени в локальную зону:
SELECT login_time AT TIME ZONE 'Asia/Yekaterinburg' FROM sessions;
- AT LOCAL для TIMESTAMP WITH LOCAL TIME ZONE:
SELECT login_time AT LOCAL FROM sessions;
- Использование CURRENT_DATE с временной зоной:
SELECT CURRENT_DATE AT TIME ZONE 'US/Pacific' FROM dual;
- Использование DBTIMEZONE:
SELECT DBTIMEZONE FROM dual;
- Использование SESSIONTIMEZONE:
SELECT SESSIONTIMEZONE FROM dual;
- CAST TIMESTAMP TO TIME ZONE:
SELECT CAST(SYSTIMESTAMP AT TIME ZONE 'Europe/Berlin' AS TIMESTAMP) FROM dual;
- Пример с 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';
- Вставка с SYSTIMESTAMP:
INSERT INTO logs (event_time) VALUES (SYSTIMESTAMP);
- Вывод TIME ZONE региона:
SELECT event_time, TO_CHAR(event_time, 'TZR') AS zone FROM logs;
- SELECT с TIME ZONE OFFSET:
SELECT TO_CHAR(SYSTIMESTAMP, 'TZD') AS abbr, TO_CHAR(SYSTIMESTAMP, 'TZH:TZM') AS offset FROM dual;
- Использование TZ_OFFSET:
SELECT TZ_OFFSET('Europe/Moscow') FROM dual;
- Использование CAST на TIMESTAMP WITH TIME ZONE:
SELECT CAST(CURRENT_TIMESTAMP AS TIMESTAMP WITH TIME ZONE) FROM dual;
- Вставка с 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'));
- Сравнение разных ZONE:
SELECT * FROM logs
WHERE event_time AT TIME ZONE 'UTC' < SYSTIMESTAMP AT TIME ZONE 'UTC';
- Преобразование к CHAR:
SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS TZR') FROM dual;
- Установка TIME_ZONE в сессии:
ALTER SESSION SET TIME_ZONE = 'Europe/Paris';
- Использование SYSDATE AT TIME ZONE:
SELECT SYSDATE AT TIME ZONE 'Asia/Bangkok' FROM dual;
- SELECT с указанием TIMESTAMP в другой ZONE:
SELECT TIMESTAMP '2025-08-30 15:00:00 US/Pacific' FROM dual;
- Использование TO_TIMESTAMP_TZ:
SELECT TO_TIMESTAMP_TZ('2025-08-30 12:00:00 Europe/London', 'YYYY-MM-DD HH24:MI:SS TZR') FROM dual;
- Удаление по дате с ZONE:
DELETE FROM logs
WHERE event_time < SYSTIMESTAMP AT TIME ZONE 'UTC';
- Сортировка по TIME ZONE:
SELECT * FROM logs ORDER BY event_time AT TIME ZONE 'UTC';
- DATE вместо TIMESTAMP:
SELECT CAST(SYSTIMESTAMP AT TIME ZONE 'UTC' AS DATE) FROM dual;
- Использование LOCALTIMESTAMP:
SELECT LOCALTIMESTAMP FROM dual;
- Разница во времени с ZONE:
SELECT SYSTIMESTAMP - FROM_TZ(TIMESTAMP '2025-08-29 23:00:00', 'UTC') FROM dual;
- Извлечение части времени:
SELECT EXTRACT(HOUR FROM SYSTIMESTAMP AT TIME ZONE 'Asia/Tokyo') FROM dual;
- 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;
- Проверка входа сегодня:
SELECT * FROM sessions
WHERE login_time AT TIME ZONE 'Europe/Minsk' >= TRUNC(SYSTIMESTAMP AT TIME ZONE 'Europe/Minsk');
- Сравнение TIMESTAMP и TIMESTAMP WITH TIME ZONE:
SELECT * FROM logs
WHERE event_time > CAST(SYSDATE AS TIMESTAMP WITH TIME ZONE);
- Фильтрация по интервалу времени:
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';
- TIME ZONE в CTE:
WITH z AS (
SELECT SYSTIMESTAMP AT TIME ZONE 'Asia/Dubai' AS local_time FROM dual
)
SELECT * FROM z;
- TIME ZONE в представлении:
CREATE VIEW v_logs_utc AS
SELECT event_time AT TIME ZONE 'UTC' AS utc_time FROM logs;
- 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);
- Использование TO_DSINTERVAL с TIME ZONE:
SELECT SYSTIMESTAMP + TO_DSINTERVAL('0 02:00:00') FROM dual;
- Переход времени в другом поясе:
SELECT login_time AT TIME ZONE 'Australia/Sydney' FROM sessions;
- TO_CHAR с временем и зоной:
SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI TZR TZD') FROM dual;
- Указание ZONE вручную:
SELECT FROM_TZ(TIMESTAMP '2025-12-31 23:59:59', 'Asia/Seoul') FROM dual;
- Текущий день в конкретной зоне:
SELECT TRUNC(SYSTIMESTAMP AT TIME ZONE 'Europe/Berlin') FROM dual;
- Использование 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 и извлекать вложенные структуры