Tốt hơn bạn nên lưu trữ ngày của mình dưới dạng DATETIME
. Khi bạn có những giá trị này, nó đã cho thấy các trường cơ sở dữ liệu của bạn không thuộc date
nhập, như chèn các chuỗi như vậy vào date
các trường sẽ không tạo ra lỗi.
Nếu không thể thay đổi điều này, thì bạn có thể sử dụng STR_TO_DATE
chức năng:
SELECT *
FROM `task`
WHERE t_status !=3
AND STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p') BETWEEN
STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p') AND
STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p')
Nhưng đó thực sự là một giải pháp kém hơn.
Tuy nhiên, kỳ vọng của bạn chỉ nhận được một hàng có vẻ kỳ lạ. Chắc chắn hàng thứ ba đáp ứng yêu cầu, vì ngày bắt đầu / ngày đến hạn trước / sau ngày bạn đang kiểm tra, bất kể phần thời gian.
Phụ lục
Trong các nhận xét, bạn đang nói rằng bạn muốn áp dụng một logic khác. Tôi đang đoán bạn muốn so sánh riêng các thành phần ngày và giờ và cả hai để tuân thủ between
tình trạng. Điều này thực sự nên được giải thích trong câu hỏi, vì hiện tại nó chưa được nêu rõ.
Trong trường hợp đó, bạn có thể sử dụng DATE_FORMAT
chỉ trích xuất phần thời gian và lặp lại điều kiện với điều đó:
SELECT *,
STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p'),
STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p'),
STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p')
FROM `task`
WHERE t_status !=3
AND STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p') BETWEEN
STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p') AND
STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p')
AND DATE_FORMAT(STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p'), '%h:%i') BETWEEN
DATE_FORMAT(STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p'), '%h:%i') AND
DATE_FORMAT(STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p'), '%h:%i')
Truy vấn này sẽ loại trừ hàng 3 khỏi kết quả.