Het is mogelijk om de gewenste datums te bepalen met combinaties van volgende_dag en regelmatige datumberekening. De onderstaande code zou redelijk dichtbij moeten zijn, maar het is niet getest en faalt waarschijnlijk in een of ander hoekgeval, maar je krijgt tenminste het algemene idee :)
where resolved_date >= next_day( trunc(sysdate) - interval '14' day, 'SUN')
and resolved_date < next_day( trunc(sysdate) - interval '7' day, 'SUN')
trunc(sysdate)
de datum inkorten tot dag; 19-04-2011 23:32:34 wordt 19-04-2011 00:00:00, d.w.z. het verwijderen van de tijdcomponent.next_day(sysdate, 'SUN')
komt de volgende zondag terug. Als sysdate toevallig een zondag is, wordt de volgende zondag geretourneerd.
Belangrijk :De dagnamen moeten in dezelfde taal zijn als uw sessie.
Het interval
ding is slechts een standaardmanier om verschillende tijdseenheden van een datum op te tellen/af te trekken.
Alles bij elkaar zou de logica voor 19 april 2011 zijn:
- Truncate sysdate => 2011-04-19 00:00:00
- 14 dagen aftrekken => 05-04-2011 00:00:00
- Zoek de volgende zondag => 2011-04-10 00:00:00
...en
- Truncate sysdate => 2011-04-19 00:00:00
- 7 dagen aftrekken => 2011-04-12 00:00:00
- Zoek de volgende zondag => 2011-04-17 00:00:00
..wat resulteert in de volgende vraag:
where resolved_date >= timestamp '2011-04-10 00:00:00'
and resolved_date < timestamp '2011-04-17 00:00:00'
Alle opgeloste_datums die plaatsvonden op of na de eerste seconde van de 10e maar vóór de eerste seconde van de 17e werden opgenomen. Merk op dat >=
en <
is niet gelijk aan between
.
Een opmerking over de prestaties:ik zou ervoor zorgen dat Oracle het datumbereik correct schat op 7 dagen en dat de juiste join-volgorde/-methode wordt gebruikt. Als u verwacht dat de query een tijdje zal duren, kunt u het zich veroorloven om de datums in de toepassing te berekenen en ze als letterlijke datums aan te leveren in plaats van ze on-the-fly te berekenen zoals ik hierboven deed.