Możliwe jest określenie dat, które chcesz, używając kombinacji następnego dnia i regularna arytmetyka dat. Poniższy kod powinien być dość zbliżony, ale nie został przetestowany i prawdopodobnie zawiedzie w jakimś rogu, ale przynajmniej masz ogólny pomysł :)
where resolved_date >= next_day( trunc(sysdate) - interval '14' day, 'SUN')
and resolved_date < next_day( trunc(sysdate) - interval '7' day, 'SUN')
trunc(sysdate)
skróć datę do dnia; 2011-04-19 23:32:34 staje się 2011-04-19 00:00:00, co oznacza usunięcie składnika czasu.next_day(sysdate, 'SUN')
wraca w następną niedzielę. Jeśli sysdate wypada w niedzielę, zwracana jest następna niedziela.
Ważne :nazwy dni muszą być w tym samym języku co sesja.interval
rzecz jest tylko standardowym sposobem dodawania/odejmowania różnych jednostek czasu od daty.
Podsumowując, logika na 19 kwietnia 2011 r. wyglądałaby następująco:
- Skróć sysdate => 19.04.2011 00:00:00
- odejmij 14 dni => 05.04.2011 00:00:00
- Znajdź następną niedzielę => 10.04.2011 00:00:00
...i
- Skróć sysdate => 19.04.2011 00:00:00
- odejmij 7 dni => 12.04.2011 00:00:00
- Znajdź następną niedzielę => 17.04.2011 00:00:00
..co skutkuje następującym zapytaniem:
where resolved_date >= timestamp '2011-04-10 00:00:00'
and resolved_date < timestamp '2011-04-17 00:00:00'
Uwzględnione zostaną wszystkie resolved_dates, które miały miejsce w pierwszej sekundzie 10:-tej lub później, ale przed pierwszą sekundą 17:-tej. Zauważ, że >=
i <
nie jest równoważne z between
.
Uwaga na temat wydajności:upewniłbym się, że Oracle poprawnie oszacował zakres dat na 7 dni i że użyto prawidłowej kolejności/metody złączenia. Jeśli spodziewasz się, że zapytanie będzie działać przez jakiś czas, możesz sobie pozwolić na obliczenie dat w aplikacji i dostarczenie ich jako literałów dat zamiast obliczania ich w locie, tak jak to zrobiłem powyżej.