Debería almacenar mejor sus fechas como DATETIME
. Como tiene estos valores, ya muestra que los campos de su base de datos no son de la date
tipo, como insertar dichas cadenas en date
campos no produciría un error.
Si esto no es posible de cambiar, puede usar el STR_TO_DATE
función:
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')
Pero esa es realmente una solución inferior.
Aún así, su expectativa de obtener solo una fila parece extraña. Ciertamente, la tercera fila cumple con el requisito, ya que las fechas de inicio/vencimiento son anteriores/posteriores a la fecha que está verificando, independientemente de las partes de tiempo.
Anexo
En los comentarios estás diciendo que quieres aplicar una lógica diferente. Estoy suponiendo desea comparar por separado los componentes de fecha y hora, y ambos para cumplir con el between
condición. Esto realmente debería explicarse en la pregunta, ya que actualmente no se especifica.
En ese caso, puede usar DATE_FORMAT
para extraer solo la parte de tiempo y repetir la condición con eso:
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á la fila 3 del resultado.