2008-11-25 37 views

Trả lời

8

Nevermind tìm thấy câu trả lời. Ty giống nhau cho bất cứ ai sẵn sàng trả lời.

WHERE DATEDIFF(mydata,'2008-11-20') >=0; 
+0

Bạn được chào đón;) – Arvo

+3

Điều này có vẻ chậm: gọi hàm và chuyển đổi ngầm cho mỗi hàng trong bảng. Phải có cách để so sánh ngày trực tiếp hơn. –

+0

Chỉ mục không được sử dụng theo cách này ... – FerranB

18

Uh, WHERE mydate<='2008-11-25' cách để làm điều đó. Cần làm việc.

Bạn có nhận được thông báo lỗi không? Bạn đang sử dụng một phiên bản cũ của MySQL?

Chỉnh sửa: Sau đây hoạt động tốt đối với tôi trên MySQL 5.x

create temporary table foo(d datetime); 
insert into foo(d) VALUES ('2000-01-01'); 
insert into foo(d) VALUES ('2001-01-01'); 
select * from foo where d <= '2000-06-01'; 
+0

Trên DBMS PostgreSQL của tôi, thực sự, nó hoạt động tốt. Có thể là một điểm yếu của MySQL? – bortzmeyer

+0

Yup nó không hoạt động trong mysql – fmsf

+1

Err, nó cũng hoạt động trên MySQL. :) Tôi chỉ thử nó để chắc chắn rằng tôi không phải là hạt. Phiên bản MySQL nào bạn sử dụng fmfs? Bạn có mắc lỗi gì không? – Eli

6

Trong cú pháp SQL chuẩn, bạn sẽ sử dụng:

WHERE mydate <= DATE '2008-11-20' 

Đó là, NGÀY từ khóa nên trước chuỗi . Tuy nhiên, trong một số DBMS, bạn không cần phải rõ ràng; hệ thống sẽ chuyển đổi cột DATE thành một chuỗi hoặc chuỗi thành giá trị DATE, tự động. Có một số hàm ý thú vị nếu ngày DATE được chuyển đổi thành một chuỗi - nếu bạn tình cờ có những ngày trong thiên niên kỷ đầu tiên (0001-01-01 .. 0999-12-31) và số 0 đầu tiên bị bỏ qua bởi hệ thống định dạng.

+0

Lưu ý rằng, nếu tất cả các ngày ở định dạng ISO 8601 như được hiển thị, các so sánh chuỗi sẽ hoạt động (nó là một tính năng của ISO 8601). – bortzmeyer

+0

Nếu các số 0 hàng đầu được bao gồm, có.Về lý thuyết, nếu bạn có ngày trước ngày 1000-01-01, DBMS có thể bỏ qua các số 0 đứng đầu. Tôi không chắc nó rất có thể, nhưng những điều thú vị hơn đã được biết đến. Oracle hỗ trợ ngày BCE (BC); những người không so sánh đáng tin cậy như chuỗi. –

0

Bạn có thể thêm các thành phần thời gian

WHERE mydate<='2008-11-25 23:59:59' 

nhưng điều đó có thể thất bại vào những ngày switchover DST nếu mydate là '2008-11-25 24:59:59', vì vậy nó có thể là an toàn nhất để lấy tất cả mọi thứ trước ngày tiếp theo:

WHERE mydate < '2008-11-26 00:00:00' 
0

Vấn đề của bạn có thể là bạn đang xử lý dữ liệu DATETIME, không chỉ ngày tháng. Nếu một hàng có mydate là '2008-11-25 09:30 AM', thì WHERE mydate < = '2008-11-25'; sẽ không trả về hàng đó. '2008-11-25' có thời gian ngụ ý là 00:00 (nửa đêm), vì vậy mặc dù phần ngày giống nhau, chúng không bằng nhau và ngày giờ lớn hơn.

Nếu bạn sử dụng < '2008-11-26' thay vì < = '2008-11-25', điều đó sẽ hoạt động. Phương thức Datediff hoạt động vì nó chỉ so sánh phần ngày tháng và bỏ qua thời gian.

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