Възможно е да определите датите, които искате, като използвате комбинации от следващия_ден и обикновена аритметика с дати. Кодът по-долу трябва да е доста близък, но не е тестван и вероятно се проваля в някой ъглов случай, но поне получавате общата идея :)
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 дни и че се използва правилният ред/метод на присъединяване. Ако очаквате заявката да се изпълнява известно време, можете да си позволите да изчислите датите в приложението и да ги предоставите като литерали за дати, вместо да ги изчислявате в движение, както направих по-горе.