2013-07-15 38 views
5

Vấn đềChọn hồ sơ, nơi datetime lớn hơn ngày quy định

Tôi cố gắng để lấy tất cả các bản ghi từ bảng nơi DATE_TIME lĩnh vực lớn hơn 'Thu, 11 tháng bảy 2013' bằng cách chạy truy vấn được đề cập dưới đây. Giá trị trong trường date_time được lưu trữ ở định dạng => Thu, 11 tháng 7 năm 2013 08:29:37. Bất kỳ trợ giúp sẽ là tuyệt vời.

Datatype của lĩnh vực DATE_TIME là varchar

Query

SELECT * FROM table_name 
WHERE username = '[email protected]' 
AND STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= 'Thu, 11 Jul 2013 00:00:00'; 
+0

Vui lòng kiểm tra kiểu dữ liệu của DATE_TIME. Là nó varchar hoặc ngày? –

+0

kiểu dữ liệu là varchar – colourtheweb

+2

Bạn cần phải chuyển đổi Chuỗi thành một ngày, không phải là ngày thành chuỗi. – Barranka

Trả lời

5

Bạn đang cố gắng so sánh ngày với chuỗi.

Ứng dụng chức năng str_to_date là chính xác, nhưng bạn không so sánh với một ngày.

Cách đúng để làm điều đó là:

select * from yourTable 
where STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= '2013-07-11 00:00:00' 

Chú ý rằng định dạng ngày là YYYY-MM-DD HH: mm: ss (đó là định dạng ngày MySQL mặc định).

Tất nhiên, bạn cũng có thể so sánh với kết quả str_to_date:

... where STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= STR_TO_DATE('Thu, 11 Jul 2013 00:00:00', '%a, %e %b %Y %H:%i:%s') 
+0

Tôi nghĩ bạn có thêm 'where' trong truy vấn thứ hai? Nếu không, vui lòng giải thích cú pháp. –

+0

@ebyrob Cảm ơn ... chỉ là lỗi đánh máy – Barranka

6

Đây lại là một ví dụ tuyệt vời về việc tại sao bạn nên thực hiện các lĩnh vực ngày/giờ trong MySQL sử dụng ngày, datetime, hoặc các loại trường dấu thời gian và cho phép ứng dụng của bạn xử lý cách định dạng ngày cho đầu ra.

Ngay bây giờ bạn sẽ cần phải làm điều gì đó như:

SELECT * FROM table_name 
WHERE username = '[email protected]' 
AND STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= STR_TO_DATE('Thu, 11 Jul 2013 00:00:00', '%a, %e %b %Y %H:%i:%s'); 

Truy vấn này sẽ không thể sử dụng bất kỳ chỉ số mà bạn có trong lĩnh vực date_time của bạn, do đó truy vấn sẽ rất hiệu quả. Nó sẽ cần phải thực hiện quét toàn bộ bảng, chuyển đổi giá trị của mỗi hàng để thực hiện so sánh.

Những gì bạn nên làm là:

SELECT * FROM table_name 
WHERE username = '[email protected]' 
AND date_time >= STR_TO_DATE('Thu, 11 Jul 2013 00:00:00', '%a, %e %b %Y %H:%i:%s'); 

đây nếu bạn có lĩnh vực của bạn trong các định dạng datetime MySQL, bạn chỉ cần chuyển đổi các đầu vào cho một định dạng này cho phù hợp. Vì dữ liệu trường của bạn đã ở định dạng này, bạn sẽ có thể sử dụng chỉ mục cho tìm kiếm.

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