Как сравнить два значения даты на основе только части даты в Oracle?

Я пытаюсь получить подсчеты за последние 30 дней со следующим запросом -

SELECT date_occured, COUNT(*) FROM problem
WHERE date_occured >= (CURRENT_DATE - 30)
GROUP BY date_occured;

//date_occured field is of type DATE.

в основном, в моем запросе я пытаюсь сравнить только часть даты в условии date_occured >= (CURRENT_DATE - 30), но, кажется, сравнить время тоже.

я попробовал TRUNC следующим образом -

TRUNC(date_occured) >= TRUNC(CURRENT_DATE - 30)

но при запуске запроса он никогда не возвращается.

Я тоже пробовал -

SELECT date_occured, COUNT(*) FROM problem    
GROUP BY date_occured
HAVING TRUNC(date_occured) >= TRUNC(CURRENT_DATE - 30);

снова он никогда не возвращается.

как я могу сравнить только части даты от два значения даты в Oracle?

4 ответов


для этого условия вам нужно только TRUNC правая сторона:

WHERE date_occured >= TRUNC(CURRENT_DATE - 30)

почему? Потому что если TRUNC(date_occured) позже TRUNC(CURRENT_DATE - 30), то любой момент времени после TRUNC(date_occured) обязательно будет позже TRUNC(CURRENT_DATE - 30).

очевидно, что всегда верно, что date_occured >= TRUNC (date_occured) (подумайте об этом).

логика говорит, что если A >= B и B >= C, то из этого следует, что A >= C

теперь заменить:

  • A: date_occured
  • B: TRUNC (date_occured)
  • C: TRUNC (CURRENT_DATE - 30)

Я думаю, вы тоже захотите trunc в выбранной части:

 SELECT TRUNC(date_occured) AS short_date_occured, COUNT(*)
 FROM problem 
 WHERE date_occured >= trunc(SYSDATE- 30) 
 GROUP BY short_date_occured;

попробуйте использовать SYSDATE vs CURRENT_DATE. Sysdate использует локальное время сервера, где CURRENT_DATE возвращает текущую дату / время для сервера в локальном времени подключения клиента.


Я склонен подозревать, что Тони прав и что вы действительно хотите только TRUNC правая часть выражения.

Если вы хотите TRUNC обе стороны выражения, и вы сталкиваетесь с проблемами производительности, вам, вероятно, нужен индекс на основе функции

CREATE INDEX idx_problem_trunc_dt_occured
    ON problem( trunc( date_occurred ) );

Это позволит вашему исходному запросу использовать функциональный индекс.