Метка времени и интервал 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<> скрипка здесь

По старинке?

systimestamp -5/(60*24)> LAST_UPDATE_TS

После проверки нескольких форумов и других страниц stackru я попробовал это, и теперь он, похоже, работает.

select *
from table
where cast(systimestamp as TIMESTAMP)  > (lst_updt_ts  + interval '3' minute);
Другие вопросы по тегам