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.
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
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