Mysql
 sql >> Datenbank >  >> RDS >> Mysql

AM/PM funktioniert nicht mit between in sql

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.