2010-09-07 90 views
5

Im làm việc trên cơ sở dữ liệu lưu trữ ngày trong trường mysql varchar(10) (rất buồn).Mysql: ngày chuyển đổi fro 'dd/mm/yyyy' thành 'yyyymmdd'

Tôi không thể thay đổi cấu trúc cơ sở dữ liệu (im xây dựng một trình cắm thêm nhỏ), nhưng tôi phải truy vấn các hàng tìm kiếm cơ sở dữ liệu trong trường dữ liệu này trong vòng 10 ngày tới.

Ví dụ:

| fid | fdate  | 
| 1 | 10/09/2010 | 
| 2 | 17/09/2010 | 
| 3 | 19/09/2010 | 

tôi phải có được các hàng với fid 1 và 2, becose ngày là < = now + 10 ngày.

Thông thường tôi làm loại truy vấn:

SELECT fid FROM table WHERE fdate <= DATE_ADD(NOW(), INTERVAL 10 DAY); 

Hoặc, nếu ngày tháng theo định dạng 'yyyymmdd':

SELECT fid FROM table WHERE fdate <= DATE_FORMAT(NOW(), '%Y%m%d'); 

Nhưng họ đang vô dụng với định dạng dd/mm/yyyy.

tôi đã tìm ra với

SELECT fid, CONCAT(SUBSTRING(fdate, 7, 4), SUBSTRING(fdate, 4, 2), SUBSTRING(fdate, 1, 2)) AS mydate FROM table HAVING mydate <= DATE_ADD(NOW(), INTERVAL 10 DAY); 

nhưng tôi đoán nó là một chút quá mức cần thiết xây dựng lại định dạng ngày với concat và chuỗi con, và mệnh đề having wont giúp tốc độ truy vấn.

Bất kỳ ý tưởng nào?

EDIT

Sau khi bình luận của Adriano, giải pháp đúng là

SELECT fid FROM test WHERE STR_TO_DATE(fdate, '%d/%m/%Y') <= DATE_ADD(NOW(), INTERVAL 10 DAY); 

vì vậy tôi có thể tránh được concat và có khoản.

+0

Bạn có thể sử dụng 'where' thay vì' have', nhưng nếu không bạn có vẻ đã giải quyết được vấn đề-- vì vậy bạn hỏi chính xác những gì? – Andomar

+0

Trong truy vấn cuối cùng tôi đã đăng, tôi không thể sử dụng 'WHERE' thay cho' HAVING', vì trường 'mydate' không thực sự tồn tại trong bảng khi mệnh đề' WHERE' được thực hiện. – Strae

Trả lời

7

Điều gì về việc sử dụng str_to_date() để tạo ngày từ định dạng của bạn?

EDIT sau khi đọc comment của bạn, tôi đã tạo ra một bảng như của bạn:

mysql> SELECT fid, fdate FROM test; 
+------+------------+ 
| fid | fdate  | 
+------+------------+ 
| 1 | 10/9/2010 | 
| 2 | 17/9/2010 | 
| 3 | 19/09/2010 | 
+------+------------+ 

và sau đó đã

mysql> SELECT fid FROM test WHERE STR_TO_DATE(fdate, '%d/%m/%Y') <= DATE_ADD(NOW(), INTERVAL 10 DAY); 
+------+ 
| fid | 
+------+ 
| 1 | 
| 2 | 
+------+ 

vẻ để làm việc. Chính xác những gì bạn nhận được?

+0

Đã thử, trong ví dụ nó hoạt động với dấu phẩy (07,09,2010) nhưng không phải với dấu gạch chéo (07/09/2010) đó là trường hợp của tôi ... tôi có sau đó để thay thế đầu tiên '/ 'bằng', ', sau đó str_to_date – Strae

+0

Ví dụ này cũng cho thấy 'CHỌN STR_TO_DATE ('04/31/2004 ','% m /% d /% Y ');' hoạt động. –

+0

Oooops bạn nói đúng, tôi đã từng viết định dạng sai, như '% m-% d-% Y' thay vì'% m /% d /% Y'! cảm ơn các bạn – Strae

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