Mysql
 sql >> Base de données >  >> RDS >> Mysql

AM/PM ne fonctionne pas en utilisant entre dans sql

Vous devriez mieux stocker vos dates en tant que DATETIME . Comme vous avez ces valeurs, cela montre déjà que les champs de votre base de données ne sont pas de la date type, comme insérer de telles chaînes dans date champs ne produiraient pas d'erreur.

S'il n'est pas possible de le modifier, vous pouvez utiliser le STR_TO_DATE fonction :

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')

Mais c'est vraiment une solution inférieure.

Pourtant, votre attente de n'obtenir qu'une seule ligne semble étrange. La troisième ligne répond certainement à l'exigence, puisque les dates de début/d'échéance sont avant/après la date que vous vérifiez, quelles que soient les périodes.

Avenant

Dans les commentaires, vous dites vouloir appliquer une logique différente. Je suppose vous souhaitez comparer séparément les composants de date et d'heure, et les deux pour respecter le between condition. Cela devrait vraiment être expliqué dans la question, car actuellement ce n'est pas spécifié.

Dans ce cas, vous pouvez utiliser DATE_FORMAT pour extraire uniquement la partie horaire, et répéter la condition avec cela :

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')

Cette requête exclura la 3 ligne du résultat.