Как общий отказ от ответственности, ваш текущий дизайн таблицы является неоптимальным, потому что a) вы сохраняете даты в виде текста, и b) вы даже не сохраняете год для каждой даты. Из того, что вы написали, похоже, что вы хотите считать все данные за последние год, начиная с текущей даты.
Здесь можно попробовать один трюк - сравнить текст MMDD
для каждой записи в вашей таблице с TO_CHAR(SYSDATE, 'MMDD')
, используя следующую логику:
- Если
MMDD
на меньше , чем или равно сегодняшнему, тогда ему присваивается текущий год (2018 на момент написания этого ответа)
- Если
MMDD
на больше , чем сегодня, тогда ему присваивается предыдущий год (2017).
Затем мы можем строить даты для каждой записи, используя соответствующий год, и проверять, находится ли она в пределах 120 дней с SYSDATE
.
WITH yourTable AS (
SELECT '0101' AS date_col FROM dual UNION ALL
SELECT '1001' FROM dual UNION ALL
SELECT '1027' FROM dual UNION ALL
SELECT '1215' FROM dual
)
SELECT
date_col
FROM yourTable
WHERE
(date_col <= TO_CHAR(SYSDATE, 'MMDD') AND
TO_DATE(date_col || TO_CHAR(SYSDATE, 'YYYY'), 'MMDDYYYY') >= SYSDATE - 120) OR
(date_col > TO_CHAR(SYSDATE, 'MMDD') AND
TO_DATE(date_col ||
TO_CHAR(TRUNC(ADD_MONTHS(SYSDATE, -12), 'YEAR'), 'YYYY'), 'MMDDYYYY') >=
SYSDATE - 120);
Демо