По-добре е да съхранявате датите си като DATETIME
. Тъй като имате тези стойности, това вече показва, че полетата на вашата база данни не са с date
тип, като вмъкване на такива низове в date
полета няма да доведат до грешка.
Ако това не е възможно да се промени, тогава можете да използвате STR_TO_DATE
функция:
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')
Но това наистина е по-лошо решение.
И все пак очакването ви да получите само един ред изглежда странно. Със сигурност третият ред отговаря на изискването, тъй като началните/крайните дати са преди/след датата, която проверявате, независимо от часовите части.
Допълнение
В коментарите казвате, че искате да приложите различна логика. Предполагам искате да сравните отделно компонентите за дата и час и двата да отговарят на between
състояние. Това наистина трябва да бъде обяснено във въпроса, тъй като в момента не е уточнено.
В такъв случай можете да използвате DATE_FORMAT
за да извлечете само частта от времето и повторете условието с това:
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')
Тази заявка ще изключи 3 реда от резултата.