#sql #oracle
#sql #Oracle
Вопрос:
Прошу прощения, поскольку я чрезвычайно новичок в SQL.
В настоящее время я пытаюсь запустить приведенное ниже:
SELECT *
FROM test.message
WHERE MESSAGESUBJECT LIKE '%test%'
AND MESSAGEDATE = CURRENT_DATE
Однако результаты не возвращаются — понял, что это связано с тем, что формат данных в поле в настоящее время выглядит следующим образом:
07-MAR-19 08.13.53.00000000 PM
Итак, очевидное решение — заставить его просматривать начало поля — где я теряю связь, так это то, что мне нужен запрос для задания, которое выполняется ежедневно, поэтому я не могу использовать exacts. Кто-нибудь может помочь?
Спасибо,
D.
Ответ №1:
SELECT *
FROM test.message
where MESSAGESUBJECT like '%test%'
and MESSAGEDATE BETWEEN TRUNC(CURRENT_DATE) AND TRUNC(CURRENT_DATE) 86399/86400
При этом будут получены строки, в которых дата сообщения была в любое время сегодняшнего дня.
Бит 86399/86400 — это количество секунд в день минус 1, поэтому BETWEEN
диапазон охватывает весь день и ни один из следующих дней (что TRUNC(CURRENT_DATE) 1
было бы уместно).
Вместо добавления 86399/86400 некоторые считают более разумным добавить целый день, а затем вычесть an INTERVAL
из 1 секунды. Это также работает, как и:
AND MESSAGEDATE >= TRUNC(SYSDATE)
AND MESSAGEDATE < TRUNC(SYSDATE) 1 -- Thanks @WernfriedDomscheit
Используя
AND TRUNC(MESSAGEDATE) = TRUNC(CURRENT_DATE)
логически правильно, но это делает невозможным для Oracle использование индекса на MESSAGEDATE
, если таковой имеется, что может лишить вас максимально возможной производительности. Но если у вас есть индекс на основе функции TRUNC(MESSAGEDATE)
, то этот последний способ также является разумным вариантом.
Комментарии:
1.
MESSAGEDATE >= TRUNC(CURRENT_DATE) AND MESSAGEDATE < TRUNC(CURRENT_DATE) 1
это еще один вариант выполнения этого.2. Огромное спасибо Мэтью — работает отлично, и я чрезвычайно ценю разбивку!
3. @WernfriedDomscheit Спасибо за дополнение. Я предпочитаю
BETWEEN
, потому что он сохраняет условие в виде отдельного выражения в предикате. Но это всего лишь мой вкус / привычка, и я легко могу представить, что в этом вопросе я в меньшинстве. Я обновил свой ответ на основе вашего комментария. Еще раз спасибо.