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.