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 некоторые считают более понятным добавить целый день, а затем вычесть INTERVAL
из 1 секунды. Это также работает, как и:
AND MESSAGEDATE >= TRUNC(SYSDATE)
AND MESSAGEDATE < TRUNC(SYSDATE)+1 -- Thanks @WernfriedDomscheit
Использование
AND TRUNC(MESSAGEDATE) = TRUNC(CURRENT_DATE)
логически правильно, но Oracle не может использовать индекс на MESSAGEDATE
, если он есть, что может лишить вас максимальной производительности. Но если у вас есть индекс, основанный на функции TRUNC(MESSAGEDATE)
, то последний способ также является разумным вариантом.