Можно определить нужные даты, используя комбинации следующий_день и арифметику обычной даты. Приведенный ниже код должен быть довольно близок, но он не проверен и, возможно, завершится неудачно в некотором угловом случае, но по крайней мере вы получите общее представление:)
where resolved_date >= next_day( trunc(sysdate) - interval '14' day, 'SUN')
and resolved_date < next_day( trunc(sysdate) - interval '7' day, 'SUN')
trunc(sysdate)
усекать дату до дня; 2011-04-19 23:32:34 становится 2011-04-19 00:00:00, т.е. удаляя компонент времени.
next_day(sysdate, 'SUN')
возвращает следующее воскресенье. Если sysdate случается в воскресенье, возвращается следующее воскресенье.
Важно : названия дней должны быть на том же языке, что и ваша сессия.
interval
- это просто стандартный способ сложения / вычитания различных единиц времени из даты.
Если сложить все вместе, логика для 19 апреля 2011 года будет такой:
- Сокращение sysdate => 2011-04-19 00: 00: 00
- вычесть 14 дней => 2011-04-05 00: 00: 00
- Найти следующее воскресенье => 2011-04-10 00: 00: 00
... и
- Сокращение sysdate => 2011-04-19 00: 00: 00
- вычесть 7 дней => 2011-04-12 00: 00: 00
- Найти следующее воскресенье => 2011-04-17 00: 00: 00
.. в результате получается следующий запрос:
where resolved_date >= timestamp '2011-04-10 00:00:00'
and resolved_date < timestamp '2011-04-17 00:00:00'
Будут включены все resolved_dates, которые произошли в первую секунду 10-го числа или после этой даты, но до первой секунды 17-го числа. Обратите внимание, что >=
и <
не эквивалентны between
.
Замечание по производительности: я бы позаботился о том, чтобы Oracle правильно оценил диапазон дат в 7 дней и чтобы использовался правильный порядок / метод соединения. Если вы ожидаете, что запрос будет выполняться какое-то время, вы можете позволить себе вычислять даты в приложении и указывать их как даты, а не вычислять их на лету, как я делал выше.