Как и случайная запятая, которая была указана в комментарии, смешивание sysdate
и current_date
выглядит странно и может вызвать странные проблемы (поскольку они могут представлять разные дни);и оба содержат время, поэтому вы, вероятно, захотите сравнить значение таблицы с trunc(case ... end)
- и вы не будете повторять этот столбец в предложении:
select a11.fact_date
from XX.X_XX_XX_XX a11
where a11.fact_date = trunc(
case
when to_char(sysdate, 'd') = '1' then sysdate - 3
when to_char(sysdate, 'd') = '7' then sysdate - 2
else sysdate - 1
end);
или, возможно, с простым выражением регистра вместоискали один (также обрабатывая значение d
как число):
select a11.fact_date
from XX.X_XX_XX_XX a11
where a11.fact_date = trunc(sysdate)
- case to_number(to_char(sysdate, 'd'))
when 1 then 3
when 7 then 2
else 1
end;
Однако значение строки / числа d
day зависит от настроек NLS, поэтому может быть безопаснее - и, возможно,яснее - использовать названия дней (принудительно переведенные на определенный язык, чтобы избежать дальнейших проблем с NLS):
select a11.fact_date
from XX.X_XX_XX_XX a11
where a11.fact_date = trunc(sysdate)
- case to_char(sysdate, 'FMDay', 'NLS_DATE_LANGUAGE=ENGLISH')
when 'Monday' then 3
when 'Sunday' then 2
else 1
end;
db <> fiddle , показывающий все три запроса на двух территориях;обратите внимание на разные результаты для первых двух запросов, а также то, что третий является одинаковым независимо от настроек NLS.