Det er bedre at gemme dine datoer som DATETIME
. Da du har disse værdier, viser det allerede, at dine databasefelter ikke er af date
type, som at indsætte sådanne strenge i date
felter ville ikke give en fejl.
Hvis dette ikke er muligt at ændre, kan du bruge 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 er virkelig en ringere løsning.
Alligevel virker din forventning om kun at få én række mærkelig. Den tredje række opfylder bestemt kravet, da start-/forfaldsdatoerne er før/efter den dato, du tjekker, uanset tidsdelene.
Tillæg
I kommentarer siger du, at du vil anvende en anden logik. Jeg gætter du ønsker at sammenligne dato- og tidskomponenterne separat, og begge dele for at overholde between
tilstand. Dette bør virkelig forklares i spørgsmålet, da det i øjeblikket ikke er specificeret.
I så fald kan du bruge DATE_FORMAT
for kun at udtrække tidsdelen, og gentag betingelsen 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')
Denne forespørgsel vil ekskludere de 3 rækker fra resultatet.