Det er muligt at bestemme de ønskede datoer ved hjælp af kombinationer af næste_dag og almindelig datoregning. Nedenstående kode burde være ret tæt på, men den er utestet og fejler sandsynligvis på en eller anden hjørnekasse, men du får i det mindste den generelle idé :)
where resolved_date >= next_day( trunc(sysdate) - interval '14' day, 'SUN')
and resolved_date < next_day( trunc(sysdate) - interval '7' day, 'SUN')
trunc(sysdate)
afkort datoen til dag; 2011-04-19 23:32:34 bliver 2011-04-19 00:00:00, dvs. fjernelse af tidskomponenten.next_day(sysdate, 'SUN')
vender tilbage næste søndag. Hvis sysdate tilfældigvis er en søndag, returneres den næste søndag.
Vigtigt :Dagens navne skal være på samme sprog som din session.interval
ting er bare en standard måde at tilføje/fratrække forskellige tidsenheder fra en dato.
Hvis man sætter det hele sammen, ville logikken for den 19. april 2011 være:
- Truncate sysdate => 2011-04-19 00:00:00
- træk fra 14 dage => 2011-04-05 00:00:00
- Find den næste søndag => 2011-04-10 00:00:00
...og
- Truncate sysdate => 2011-04-19 00:00:00
- træk fra 7 dage => 2011-04-12 00:00:00
- Find den næste søndag => 2011-04-17 00:00:00
..resulterer i følgende forespørgsel:
where resolved_date >= timestamp '2011-04-10 00:00:00'
and resolved_date < timestamp '2011-04-17 00:00:00'
Alle resolved_dates, der skete på eller efter det første sekund af den 10. men før det første sekund af den 17. ville blive inkluderet. Bemærk at >=
og <
svarer ikke til between
.
En note om ydeevne:Jeg vil sikre mig, at Oracle korrekt estimerer datointervallet til at være 7 dage, og at den korrekte joinordre/metode bruges. Hvis du forventer, at forespørgslen kører i et stykke tid, kan du tillade dig at beregne datoerne i applikationen og levere dem som datobogstaver i stedet for at beregne dem med det samme, som jeg gjorde ovenfor.