2012-12-21 47 views
8

thể trùng lặp:
Get from database but only last 30 daysBắt quả mysql từ 30 ngày qua

Hi Tôi có một số mã php mà tôi sử dụng để đếm các dòng trong một cơ sở dữ liệu từ 30 ngày qua . Vấn đề là, nếu tôi thay đổi đoạn mã để số thay đổi từ -30 thành -20, số đầu ra đi từ 272 đến 360 thay vì đi xuống.

Đây là mã:

$result = mysql_query("SELECT * FROM all_count WHERE DATEDIFF(date,NOW()) = -30 and member ='000002'"); 
$num_rows60 = mysql_num_rows($result); 
+0

Câu hỏi tương tự trong mô tả đầy đủ http://stackoverflow.com/questions/13912035/display-record-older-than-3-months-in-sql/13912197#13912197 – softsdev

+0

Bạn đang chọn các bản ghi * chính xác * 30 hoặc 20 ngày tuổi. – JJJ

Trả lời

15

Hãy thử điều này

select * from `table` where `yourfield` >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH) 

Đối ngày, năm xem dưới đây làm ví dụ.

DATE_SUB(CURDATE(), INTERVAL 15 DAY) /*For getting record specific days*/ 

DATE_SUB(CURDATE(), INTERVAL 1 YEAR) /*for getting records specific years*/ 


Đối với Anand, truy vấn

BETWEEN DATE_SUB(CURDATE() ,INTERVAL 6 MONTH) AND DATE_SUB(CURDATE() ,INTERVAL 3 MONTH) 
/* For Getting records between last 6 month to last 3 month 
+0

Wow rất đẹp này Đầy đủ Explained –

+0

Cảm ơn, lời giải thích của bạn thực sự đã giúp tôi hiểu sự khác biệt và làm thế nào nó nên được thực hiện.Cảm ơn –

2

Bạn có thể sử dụng thay vì:

$result = mysql_query("SELECT * FROM all_count WHERE `date`< DATE(NOW() - INTERVAL 30 DAY) and  member ='000002'"); 
+0

Điều đó làm việc hoàn hảo nhờ –

0

Như bạn thấy trong tài liệu here, các DATEDIFF chức năng trong MySQL cho bạn biết sự khác biệt trong ngày ngày đầu tiên đến ngày thứ hai.

Truy vấn của bạn chỉ chọn tất cả các hàng có sự khác biệt chính xác là 30 ngày và không phải là những ngày cách đây tối đa 30 ngày. Vì vậy, nó hoàn toàn có thể, rằng số hàng cho ngày 20 ngày trước cao hơn 30 ngày trước. Những gì bạn có khả năng nhất muốn là:

SELECT * FROM all_count WHERE DATEDIFF(date,NOW()) >= -30 and member ='000002' 
4

Nó tốt hơn để so sánh

`date`< DATE(NOW() - INTERVAL 30 DAY) 

hơn

DATEDIFF(date,NOW()) = -30 

Trong trường hợp đầu tiên, ngày c alculation được thực hiện chỉ một lần, ở đầu truy vấn, và cơ sở dữ liệu có thể sử dụng bất kỳ chỉ mục nào trên cột ngày tháng.

Truy vấn thứ hai phải tính DATEDIFF trên mỗi hàng và cơ sở dữ liệu không thể sử dụng bất kỳ chỉ mục nào. Truy vấn thứ hai bắt buộc quét toàn bộ bảng.

Ngoài ra, tôi đặc biệt khuyên bạn không nên gọi cho cột của mình date. Có, tôi biết bạn có thể trích dẫn tên với backticks, nhưng đó chỉ là lộn xộn và khi bạn quên sau đó lỗi cú pháp của bạn sẽ khó quên. Hãy đưa ra một tên mô tả hơn cho cột. Đây là loại ngày nào? Ngày đại diện cho ngày nào?

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