sql >> Base de Datos >  >> RDS >> Mysql

AM/PM no funciona usando between in sql

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.