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.