Dimungkinkan untuk menentukan tanggal yang Anda inginkan menggunakan kombinasi hari_berikutnya dan aritmatika tanggal biasa. Kode di bawah ini seharusnya cukup dekat, tetapi belum diuji dan mungkin gagal pada beberapa kasus sudut, tetapi setidaknya Anda mendapatkan gambaran umum :)
where resolved_date >= next_day( trunc(sysdate) - interval '14' day, 'SUN')
and resolved_date < next_day( trunc(sysdate) - interval '7' day, 'SUN')
trunc(sysdate)
potong tanggal ke hari; 19-04-2011 23:32:34 menjadi 19-04-2011 00:00:00, yaitu menghapus komponen waktu.next_day(sysdate, 'SUN')
kembali pada hari Minggu berikutnya. Jika sysdate kebetulan hari minggu, minggu berikutnya dikembalikan.
Penting :Nama hari harus dalam bahasa yang sama dengan sesi Anda.interval
hal hanyalah cara standar untuk menambah/mengurangi unit waktu yang berbeda dari tanggal.
Jika digabungkan, logika untuk 19 April 2011 adalah:
- Truncate sysdate => 2011-04-19 00:00:00
- kurangi 14 hari => 05-04-2011 00:00:00
- Cari minggu depan => 10-04-2011 00:00:00
...dan
- Truncate sysdate => 2011-04-19 00:00:00
- kurangi 7 hari => 2011-04-12 00:00:00
- Cari minggu depan => 17-04-2011 00:00:00
..menghasilkan kueri berikut:
where resolved_date >= timestamp '2011-04-10 00:00:00'
and resolved_date < timestamp '2011-04-17 00:00:00'
Semua tanggal_penyelesaian yang terjadi pada atau setelah detik pertama tanggal 10 tetapi sebelum detik pertama tanggal 17 akan disertakan. Perhatikan bahwa >=
dan <
tidak setara dengan between
.
Catatan tentang kinerja:Saya akan memastikan bahwa Oracle memperkirakan dengan benar rentang tanggal menjadi 7 hari, dan bahwa urutan/metode bergabung yang benar digunakan. Jika Anda mengharapkan kueri berjalan untuk sementara waktu, Anda dapat menghitung tanggal dalam aplikasi dan menyediakannya sebagai literal tanggal alih-alih menghitungnya dengan cepat seperti yang saya lakukan di atas.