Запрос 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