Метка времени и интервал Oracle
У меня есть требование получить записи из таблицы, systimestamp > LAST_UPDATE_TS + 5 minutes interval
Не могли бы вы помочь с вопросом?
ORACLE DB - 11G Version.
Я пробовал это, как показано ниже, но не работал должным образом.
SYSTIMESTAMP : 11-MAR-20 06.06.00.070695 AM -05:00
LAST_UPDATE_TS : 11-MAR-20 06.05.50.781167 AM
После применения этого условия systimestamp > LAST_UPDATE_TS + INTERVAL '5' MINUTE
, Я ожидаю, что данные не должны возвращаться, но все же получаю строки, не удовлетворяющие условию.
4 ответа
SYSTIMESTAMP
возвращает TIMESTAMP WITH TIME ZONE
значение, которое сравнивается с TIMESTAMP
значение.
Собственно Oracle и делает это:
SYSTIMESTAMP > FROM_TZ(LAST_UPDATE_TS + INTERVAL '5' MINUTE, SESSIONTIMEZONE)
Само сравнение выполняется по времени UTC.
SYSTIMESTAMP
возвращается в часовом поясе операционной системы сервера баз данных. Если этот часовой пояс совпадает с вашим текущимSESSIONTIMEZONE
тогда условие работает должным образом.
Измените часовой пояс сеанса на часовой пояс операционной системы сервера баз данных или попробуйте следующий:
LOCALTIMESTAMP > LAST_UPDATE_TS + INTERVAL '5' MINUTE
который вообще не использует часовые пояса.
Вы сравниваете SYSTIMESTAMP
который является TIMESTAMP WITH TIME ZONE
тип данных в TIMESTAMP(6)
тип данных; для этого требуется преобразование в часовой пояс.
Если вы используете:
SELECT SESSIONTIMEZONE FROM DUAL;
Вы можете увидеть часовой пояс, который использует ваш сеанс.
На скрипте db<> значение по умолчанию - UTC (+00:00) и выполняется:
SELECT DUMMY AS query1
FROM DUAL
WHERE TIMESTAMP '2020-03-11 06:06:00.070695 -05:00' > TIMESTAMP '2020-03-11 06:05:50.781167' + INTERVAL '5' MINUTE
Выходы:
| QUERY1 | |: ----- | | X |
поскольку 2020-03-11 06:06:00.070695 -05:00
больше, чем 2020-03-11 06:10:50.781167 +00:00
.
Если вы измените часовой пояс сеанса:
ALTER SESSION SET TIME_ZONE = '-05:00';
и снова запустите тот же запрос (для предотвращения кеширования использовался другой псевдоним столбца):
SELECT DUMMY AS query2
FROM DUAL
WHERE TIMESTAMP '2020-03-11 06:06:00.070695 -05:00' > TIMESTAMP '2020-03-11 06:05:50.781167' + INTERVAL '5' MINUTE
Тогда на выходе будут нулевые строки:
| QUERY2 | |: ----- |
Если вы хотите вручную установить часовой пояс при преобразовании, вы можете использовать FROM_TZ
функция:
SELECT DUMMY AS query3
FROM DUAL
WHERE TIMESTAMP '2020-03-11 06:06:00.070695 -05:00' > FROM_TZ( TIMESTAMP '2020-03-11 06:05:50.781167', '-05:00' ) + INTERVAL '5' MINUTE
Что, опять же, выводит нулевые строки:
| QUERY3 | |: ----- |
db<> скрипка здесь
После проверки нескольких форумов и других страниц stackru я попробовал это, и теперь он, похоже, работает.
select *
from table
where cast(systimestamp as TIMESTAMP) > (lst_updt_ts + interval '3' minute);