2012-02-08 23 views
8

Tôi muốn truy vấn tất cả các sản phẩm được bán trong 5 năm qua.
Có thể làm điều đó như thế này:Truy vấn 5 năm qua

select * from products 
where time between sysdate-1826 and sysdate 

Nhưng nó ở đó cũng là một cách đẹp hơn thay vì tính toán tất cả các ngày và trừ nó từ sysdate?

+0

Điều này được gián tiếp giải quyết bằng câu trả lời của @ JustinCave, nhưng 1826 ngày không nhất quán bằng 5 năm (khoảng 5 năm có thể chứa 1 hoặc 2 năm nhuận). Đó là lý do tại sao nó tốt hơn để sử dụng các toán tử xử lý trong cả tháng hoặc năm (nhất quán). – Allan

Trả lời

17
SELECT * 
    FROM products 
WHERE date_column >= add_months(sysdate, -12*5) 

hoặc

SELECT * 
    FROM products 
WHERE date_column >= sysdate - interval '5' year 

cả hai sẽ cung cấp cho bạn tất cả các hàng từ 5 năm trở lại đây (mặc dù bạn thường muốn thêm TRUNC để xóa phần thời gian trừ khi bạn thực sự quan tâm liệu một hàng đã được tạo vào ngày 8 tháng 2 năm 2007 vào buổi sáng hoặc buổi chiều).

+1

Lưu ý về ví dụ thứ hai: số học khoảng sẽ tăng" ORA-01839: ngày không hợp lệ cho tháng được chỉ định "nếu sysdate xảy ra là ngày nhuận. –

0
select * from products 
where time > DATE_SUB(NOW(), INTERVAL 5 YEAR) 

ngày sub sẽ trừ đi 5 năm từ nay

+1

trên Oracle, sẽ không hoạt động date_sub và bây giờ() –

+2

@James L - DATE_SUB không phải là một chức năng có sẵn trong Oracle. Tôi tin rằng đó là một chức năng SQL Server. –

+0

Cảm ơn, nhưng tôi đã nhận được lỗi sau 'thiếu dấu ngoặc đơn phải'. Sau đó, tôi thấy điều này: [date_sub() đưa ra lỗi] (https://forums.oracle.com/forums/thread.jspa?threadID=2171098) và đây là giải pháp: 'where time> SYSDATE - INTERVAL '5' YEAR ' –

Các vấn đề liên quan