2012-11-22 34 views
19

Tôi googled và thử một số cách để so sánh ngày nhưng tiếc là đã không nhận được kết quả như mong đợi. Tôi có tình trạng hiện tại của hồ sơ như sau:so sánh ngày mysql với date_format

 mysql> select date_format(date(starttime),'%d-%m-%Y') from data; 

       +-----------------------------------------+ 
       | date_format(date(starttime),'%d-%m-%Y') | 
       +-----------------------------------------+ 
       | 28-10-2012        | 
       | 02-11-2012        | 
       | 02-11-2012        | 
       | 02-11-2012        | 
       | 03-11-2012        | 
       | 03-11-2012        | 
       | 07-11-2012        | 
       | 07-11-2012        | 

Tôi muốn so sánh ngày và do đó làm như thế này:

 mysql> select date_format(date(starttime),'%d-%m-%Y') from data where date_format(date(starttime),'%d-%m-%y') >= '02-11-2012'; 
       +-----------------------------------------+ 
       | date_format(date(starttime),'%d-%m-%Y') | 
       +-----------------------------------------+ 
       | 28-10-2012        | 
       | 02-11-2012        | 
       | 02-11-2012        | 
       | 02-11-2012        | 
       | 03-11-2012        | 
       | 03-11-2012        | 
       | 07-11-2012        | 
       | 07-11-2012        | 

Tôi tin rằng kết quả không nên bao gồm '28 -10-2012' . Bất kì lời đề nghị nào? Cảm ơn trước.

Trả lời

37

định dạng của bạn là về cơ bản không phải là một sắp xếp được để bắt đầu - bạn đang so sánh chuỗi, và chuỗi "28-10-2012" lớn hơn "02-11-2012".

Thay vào đó, bạn phải so sánh ngày là ngày và sau đó chỉ chuyển đổi chúng thành định dạng mục tiêu của bạn cho đầu ra.

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

select date_format(date(starttime),'%d-%m-%Y') from data 
where date(starttime) >= date '2012-11-02'; 

(Đầu vào phải luôn ở dạng năm-tháng-giá trị, theo the documentation.)

Lưu ý rằng nếu starttime là một lĩnh vực DATETIME, bạn có thể muốn xem xét thay đổi truy vấn để tránh chuyển đổi lặp lại. (Các ưu cũng có thể đủ để tránh nó thông minh, nhưng nó có giá trị kiểm tra.)

select date_format(date(starttime),'%d-%m-%Y') from data 
where starttime >= '2012-11-02 00:00:00'; 

(Lưu ý rằng đó là bất thường để định dạng một ngày như d-m-Y để bắt đầu - nó sẽ là tốt hơn để sử dụng y-M-d nói chung, là tiêu chuẩn ISO-8601, v.v. Tuy nhiên, mã ở trên thực hiện những gì bạn yêu cầu trong câu hỏi.)

+0

cảm ơn rất nhiều, đây chính xác là những gì tôi đang tìm kiếm :). –

+1

@MahmoudGamal: chỉnh sửa của bạn không có ý nghĩa. Chỉ định một ngày tháng bằng cách sử dụng cú pháp 'ngày '2012-11-02'' ** là ** hợp lệ (trên thực tế nó là tiêu chuẩn SQL để chỉ định ngày tháng). Xem tại đây: http://sqlfiddle.com/#!2/d41d8/4020 –

+0

@JonSkeet: Bạn có thể chỉ định một chữ thời gian bằng cách sử dụng chữ chuẩn SQL: 'timestamp '2012-11-02 00:00:00' '(thay vì sử dụng chuỗi" đơn giản "). –

1

Sử dụng 2012-11-02 thay vì ngày 02-11-2012 và bạn sẽ không cần date_format() nữa

0

Sử dụng phương pháp sau:

public function dateDiff ($date1, $date2) { 
/* Return the number of days between the two dates: */ 
    return round(abs(strtotime($date1)-strtotime($date2))/86400); 
} 
/* end function dateDiff */ 

Nó sẽ giúp bạn!