Sie sollten Ihre Daten besser als DATETIME
speichern . Da Sie diese Werte haben, zeigt es bereits, dass Ihre Datenbankfelder nicht vom date
sind Typ, wie das Einfügen solcher Zeichenfolgen in date
Felder würden keinen Fehler erzeugen.
Wenn dies nicht möglich ist, können Sie den STR_TO_DATE
verwenden 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')
Aber das ist wirklich eine minderwertige Lösung.
Dennoch scheint Ihre Erwartung, nur eine Zeile zu erhalten, seltsam. Sicherlich erfüllt die dritte Zeile die Anforderung, da die Start-/Fälligkeitsdaten vor/nach dem von Ihnen überprüften Datum liegen, unabhängig von den Zeitabschnitten.
Nachtrag
In Kommentaren sagen Sie, Sie wollen eine andere Logik anwenden. Ich vermute Sie die Datums- und Zeitkomponenten separat vergleichen möchten und beide dem between
entsprechen Bedingung. Dies sollte wirklich in der Frage erklärt werden, da es derzeit nicht angegeben ist.
In diesem Fall können Sie DATE_FORMAT
verwenden um nur den Zeitteil zu extrahieren, und wiederholen Sie die Bedingung damit:
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')
Diese Abfrage schließt die 3. Zeile aus dem Ergebnis aus.