Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

AM/PM não está funcionando usando entre no sql


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.