Вы можете сделать это, избегая оператора case и используя усечение даты - 20 до месяца, например:
SELECT account,
start_date,
amount
FROM table1
WHERE start_date >= TRUNC(SYSDATE - 20, 'mm')
AND start_date < add_months(TRUNC(dt - 20, 'mm'), 1);
Если вам действительно нужно было использовать выражение CASE
(вы не можете используйте оператор CASE
в SQL), вам нужно сделать что-то вроде:
SELECT account,
start_date,
amount
FROM table1
WHERE start_date >= CASE WHEN to_char(SYSDATE, 'dd') <= '20' THEN add_months(TRUNC(SYSDATE, 'mm'), -1) ELSE TRUNC(SYSDATE, 'mm') END
AND start_date < CASE WHEN to_char(SYSDATE, 'dd') <= '20' THEN TRUNC(SYSDATE, 'mm') ELSE add_months(TRUNC(SYSDATE, 'mm'), 1) END;
Примечание: если вы используете функцию, вам не нужно заключать ее в select .. from dual
, вы можете использовать его непосредственно в операторе SQL.
Я также предположил, что вам нужен динамический диапазон c, например, если день месяца равен 20 или меньше, диапазон равен за предыдущий месяц, в противном случае текущий месяц.
ETA: Вы бы использовали два вышеупомянутых запроса, если в столбце start_date
есть индекс, в противном случае вы можете просто сделать:
SELECT account,
start_date,
amount
FROM table1
WHERE TRUNC(start_date, 'mm') = TRUNC(SYSDATE - 20, 'mm');