Mysql
 sql >> Database >  >> RDS >> Mysql

AM/PM non funziona utilizzando tra in sql

Dovresti memorizzare meglio le tue date come DATETIME . Poiché hai questi valori, mostra già che i campi del tuo database non sono della date digitare, inserendo tali stringhe in date i campi non genererebbero un errore.

Se non è possibile modificarlo, puoi utilizzare il STR_TO_DATE funzione:

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

Ma questa è davvero una soluzione scadente.

Tuttavia, la tua aspettativa di ottenere solo una riga sembra strana. Sicuramente la terza riga soddisfa il requisito, poiché le date di inizio/scadenza sono precedenti/successive alla data che stai controllando, indipendentemente dalle fasce orarie.

Addendum

Nei commenti stai dicendo che vuoi applicare una logica diversa. Sto indovinando vuoi confrontare separatamente le componenti di data e ora ed entrambe per rispettare il between condizione. Questo dovrebbe essere spiegato nella domanda, poiché attualmente non è specificato.

In tal caso, puoi utilizzare DATE_FORMAT per estrarre solo la parte temporale e ripetere la condizione con questo:

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

Questa query escluderà la riga 3 dal risultato.