Дата Oracle SQL Todays из данных

#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 , потому что он сохраняет условие в виде отдельного выражения в предикате. Но это всего лишь мой вкус / привычка, и я легко могу представить, что в этом вопросе я в меньшинстве. Я обновил свой ответ на основе вашего комментария. Еще раз спасибо.