Запрос Oracle между двумя временными метками не возвращает записи

Я пытаюсь получить все записи в базе данных, которые имеют дату обновления между интервалом systimestamp -15 минут, до текущей systimestamp.

Итак, что я делаю:

and (CAST (update_date AS TIMESTAMP)  at time zone 'UTC') BETWEEN  (cast((systimestamp - interval '15' minute) at time zone 'UTC' as timestamp)) AND  (cast((systimestamp) at time zone 'UTC' as timestamp))

Если я возьму их отдельно для конкретной записи:

(CAST (update_date AS TIMESTAMP)  at time zone 'UTC') -> 26-APR-18 01.10.16.000000000 AM UTC
(cast((systimestamp - interval '15' minute) at time zone 'UTC' as timestamp)) -> 26-APR-18 12.57.04.136000000 AM
(cast((systimestamp) at time zone 'UTC' as timestamp)) -> 26-APR-18 01.12.04.136000000 AM

По сути, первый находится между двумя другими, поэтому запрос должен вернуть запись, но это не так. Любая помощь?

1 ответ

Решение

SYSTIMESTAMP возвращает TIMESTAMP WITH TIME ZONE значение.

Если предположить, update_date также TIMESTAMP WITH TIME ZONE вам вообще не нужен актерский состав, просто бегите

update_date BETWEEN SYSTIMESTAMP - interval '15' minute AND SYSTIMESTAMP

Сравнения всегда выполняются внутри UTC, см. Datetime и Interval Arithmetic:

База данных Oracle выполняет всю арифметику меток времени в формате UTC. Для данных TIMESTAMP WITH LOCAL TIME ZONE Oracle Database преобразует значение datetime из часового пояса базы данных в UTC и после выполнения арифметики преобразует обратно в часовой пояс базы данных. Для данных TIMESTAMP WITH TIME ZONE значение даты и времени всегда указывается в формате UTC, поэтому преобразование не требуется.

Как у вас DATE значения в PST (нб, как вы справляетесь с переходом на летнее время в этом случае?)

FROM_TZ(CAST(update_date AS TIMESTAMP), 'PST') BETWEEN SYSTIMESTAMP - interval '15' minute AND SYSTIMESTAMP
Другие вопросы по тегам