Você deve armazenar melhor suas datas como
DATETIME
. Como você tem esses valores, já mostra que os campos do seu banco de dados não são da date
tipo, como inserir essas strings em date
campos não produziriam um erro. Se isso não for possível, você pode usar o
STR_TO_DATE
função: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')
Mas essa é realmente uma solução inferior.
Ainda assim, sua expectativa de obter apenas uma linha parece estranha. Certamente a terceira linha atende ao requisito, pois as datas de início/vencimento são anteriores/após a data que você está verificando, independentemente das partes do tempo.
Adendo
Nos comentários, você está dizendo que deseja aplicar uma lógica diferente. Estou supondo você deseja comparar separadamente os componentes de data e hora, e ambos para cumprir o
between
doença. Isso realmente deve ser explicado na pergunta, pois atualmente não é especificado. Nesse caso, você pode usar
DATE_FORMAT
para extrair apenas a parte do tempo, e repita a condição com isso: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')
Esta consulta excluirá a 3 linha do resultado.