Как сравнить два значения даты на основе только части даты в 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 ) );
Это позволит вашему исходному запросу использовать функциональный индекс.