Je možné určit data, která chcete, pomocí kombinací další_den a aritmetika běžného data. Níže uvedený kód by měl být docela blízko, ale není otestován a pravděpodobně selže na nějakém rohovém pouzdru, ale alespoň máte obecnou představu :)
where resolved_date >= next_day( trunc(sysdate) - interval '14' day, 'SUN')
and resolved_date < next_day( trunc(sysdate) - interval '7' day, 'SUN')
trunc(sysdate)
zkrátit datum na den; 2011-04-19 23:32:34 se změní na 2011-04-19 00:00:00, tj. odstraní časovou složku.next_day(sysdate, 'SUN')
se vrací příští neděli. Pokud je sysdate náhodou neděle, vrátí se další neděle.
Důležité :Názvy dnů musí být ve stejném jazyce jako vaše relace.interval
věc je jen standardní způsob přidávání/odečítání různých jednotek času od data.
Když to dáme dohromady, logika pro 19. dubna 2011 by byla:
- Zkrátit sysdate => 2011-04-19 00:00:00
- odečíst 14 dní => 2011-04-05 00:00:00
- Najít další neděli => 2011-04-10 00:00:00
...a
- Zkrátit sysdate => 2011-04-19 00:00:00
- odečíst 7 dní => 2011-04-12 00:00:00
- Najít další neděli => 2011-04-17 00:00:00
..výsledkem je následující dotaz:
where resolved_date >= timestamp '2011-04-10 00:00:00'
and resolved_date < timestamp '2011-04-17 00:00:00'
Budou zahrnuta všechna vyřešená_data, která se stala první sekundou 10. dne nebo po něm, ale před první sekundou 17. dne. Všimněte si, že >=
a <
není ekvivalentní between
.
Poznámka k výkonu:Ujistil bych se, že Oracle správně odhadne rozsah dat na 7 dní a že bude použita správná objednávka/metoda spojení. Pokud očekáváte, že dotaz bude nějakou dobu běžet, můžete si dovolit vypočítat data v aplikaci a dodat je jako datové litterály místo toho, abyste je počítal za chodu, jako jsem to dělal výše.