Det är bättre att lagra dina datum som DATETIME
. Eftersom du har dessa värden visar det redan att dina databasfält inte är av date
typ, som att infoga sådana strängar i date
fält skulle inte ge ett fel.
Om detta inte är möjligt att ändra kan du använda STR_TO_DATE
funktion:
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')
Men det är verkligen en sämre lösning.
Ändå verkar din förväntan på att bara få en rad märklig. Förvisso uppfyller den tredje raden kravet, eftersom start-/förfallodatum är före/efter det datum du kontrollerar, oavsett tidsdelarna.
Tillägg
I kommentarerna säger du att du vill tillämpa en annan logik. Jag gissar du vill jämföra datum- och tidskomponenterna separat, och båda för att följa between
skick. Detta borde verkligen förklaras i frågan, eftersom det för närvarande inte är specificerat.
I så fall kan du använda DATE_FORMAT
för att bara extrahera tidsdelen, och upprepa villkoret med det:
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')
Den här frågan kommer att utesluta raden 3 från resultatet.