U kunt uw datums beter opslaan als DATETIME
. Omdat je deze waarden hebt, laat het al zien dat je databasevelden niet van de date
zijn type, zoals het invoegen van dergelijke strings in date
velden zouden geen fout opleveren.
Als dit niet kan worden gewijzigd, kunt u de STR_TO_DATE
. gebruiken functie:
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')
Maar dat is echt een inferieure oplossing.
Toch lijkt je verwachting om maar één rij te krijgen vreemd. De derde rij voldoet zeker aan de vereiste, aangezien de start-/einddatums vóór/na de datum zijn die u controleert, ongeacht de tijdsdelen.
Aanvulling
In opmerkingen zegt u dat u een andere logica wilt toepassen. Ik denk het u de datum- en tijdcomponenten afzonderlijk wilt vergelijken, en beide om te voldoen aan de between
voorwaarde. Dit moet echt worden uitgelegd in de vraag, omdat het momenteel niet is gespecificeerd.
In dat geval kunt u DATE_FORMAT
. gebruiken om alleen het tijdgedeelte te extraheren en de voorwaarde daarmee te herhalen:
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')
Deze zoekopdracht zal de 3 rij uitsluiten van het resultaat.