Có thể xác định ngày bạn muốn bằng cách sử dụng kết hợp next_day và số học ngày thường. Đoạn mã dưới đây hẳn là khá gần, nhưng nó chưa được kiểm tra và có thể thất bại trong một số trường hợp góc, nhưng ít nhất bạn có được ý tưởng chung :)
where resolved_date >= next_day( trunc(sysdate) - interval '14' day, 'SUN')
and resolved_date < next_day( trunc(sysdate) - interval '7' day, 'SUN')
trunc(sysdate)
cắt ngắn ngày thành ngày; 2011-04-19 23:32:34 trở thành 2011-04-19 00:00:00, tức là xóa thành phần thời gian. next_day(sysdate, 'SUN')
trả lại vào chủ nhật tiếp theo. Nếu sysdate là chủ nhật, thì chủ nhật tiếp theo sẽ được trả về.
Quan trọng :Tên ngày phải cùng ngôn ngữ với phiên của bạn.
interval
chỉ là một cách tiêu chuẩn để cộng / trừ các đơn vị thời gian khác nhau từ một ngày.
Tổng hợp tất cả lại với nhau, logic cho ngày 19 tháng 4 năm 2011 sẽ là:
- Cắt ngắn sysdate => 2011-04-19 00:00:00
- trừ đi 14 ngày => 2011-04-05 00:00:00
- Tìm chủ nhật tiếp theo => 2011-04-10 00:00:00
... và
- Cắt ngắn sysdate => 2011-04-19 00:00:00
- trừ đi 7 ngày => 2011-04-12 00:00:00
- Tìm chủ nhật tiếp theo => 2011-04-17 00:00:00
.. dẫn đến truy vấn sau:
where resolved_date >= timestamp '2011-04-10 00:00:00'
and resolved_date < timestamp '2011-04-17 00:00:00'
Tất cả các ngày giải quyết xảy ra vào hoặc sau giây đầu tiên của ngày 10:nhưng trước giây đầu tiên của ngày 17:thứ sẽ được bao gồm. Lưu ý rằng >=
và <
không tương đương với between
.
Lưu ý về hiệu suất:Tôi đảm bảo rằng Oracle ước tính chính xác phạm vi ngày là 7 ngày và sử dụng đúng thứ tự / phương pháp kết hợp. Nếu bạn mong đợi truy vấn chạy trong một thời gian, bạn có thể đủ khả năng để tính toán các ngày trong ứng dụng và cung cấp chúng dưới dạng các ngày tháng thay vì tính toán chúng một cách nhanh chóng như tôi đã làm ở trên.