Lepiej przechowuj daty jako DATETIME
. Ponieważ masz te wartości, pokazuje już, że pola Twojej bazy danych nie są z date
wpisz, jak wstawienie takich ciągów do date
pola nie powodowałyby błędu.
Jeśli nie można tego zmienić, możesz użyć STR_TO_DATE
funkcja:
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')
Ale to naprawdę gorsze rozwiązanie.
Mimo to oczekiwanie, że otrzymasz tylko jeden wiersz, wydaje się dziwne. Z pewnością trzeci wiersz spełnia ten wymóg, ponieważ daty rozpoczęcia/zakończenia są przed/po sprawdzanej dacie, niezależnie od części czasowych.
Uzupełnienie
W komentarzach mówisz, że chcesz zastosować inną logikę. zgaduję chcesz osobno porównać składniki daty i godziny, a oba te elementy są zgodne z between
stan. To naprawdę powinno być wyjaśnione w pytaniu, ponieważ obecnie nie jest to określone.
W takim przypadku możesz użyć DATE_FORMAT
aby wyodrębnić tylko część czasu i powtórzyć z tym warunek:
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')
To zapytanie wykluczy 3 wiersze z wyniku.