Data byste měli raději ukládat jako DATETIME
. Protože máte tyto hodnoty, již to ukazuje, že vaše databázová pole nejsou z date
typu, jako vkládání takových řetězců do date
pole by nezpůsobilo chybu.
Pokud to nelze změnit, můžete použít STR_TO_DATE
funkce:
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')
Ale to je opravdu podřadné řešení.
Přesto se vaše očekávání, že dostanete pouze jeden řádek, zdá podivné. Třetí řádek určitě splňuje požadavek, protože data zahájení/splatnosti jsou před/po datu, které kontrolujete, bez ohledu na časové části.
Dodatek
V komentářích říkáte, že chcete použít jinou logiku. hádám chcete porovnat odděleně složky data a času a obě tak, aby vyhovovaly between
stav. To by skutečně mělo být vysvětleno v otázce, protože v současné době to není specifikováno.
V takovém případě můžete použít DATE_FORMAT
extrahovat pouze časovou část a zopakovat podmínku s tímto:
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')
Tento dotaz vyloučí z výsledku 3 řádek.