Creé un objeto DateTime con PHP y lo inserté en la hora programada de la columna de la base de datos, como esto: 2017-03-13 07:30:00

Ahora quiero ejecutar una consulta y seleccionar las filas que tienen la misma hora o la hora es menor que la hora actual, suponiendo que la hora actual sea 2017-03-13 08:30:00. Quiero ignorar los segundos porque eso no importa.

Hago esto:

SELECT * FROM fp_mail_reminder
        WHERE DATE_FORMAT(scheduledtime, '%d.%m.%Y %k:%i') <= DATE_FORMAT('2017-03-13 08:30:00', '%d.%m.%Y %k:%i')
        AND active = 1
        ORDER BY id ASC

Sin embargo, la consulta no genera una fila que se haya insertado con 2017-03-13 07:30:00. Si cambio la fecha de esta manera: 2017-03-12 07:30:00 - entonces cambio el día, el resultado está llegando.

¿Alguien puede decir por qué este es el caso?

1
Torben 13 mar. 2017 a las 14:13

2 respuestas

La mejor respuesta

Lo que está haciendo es comparar los valores de cadena en lugar de los valores de fecha reales. El problema aquí es que la comparación de cadenas de '21 .01.2017 'es mayor que '01 .03.2017' aunque la fecha es anterior. Esto se debe a que la comparación de cadenas compara carácter por carácter, comenzando por el primero:

  • El primer carácter de 21.01.2017 => 2
  • El primer carácter de 01.03.2017 => 0

Y 0 es menor que 2 (incluso en Unicode, Latin1, ASCII, sea cual sea su conjunto de caracteres y clasificación).

Por cierto, esta es la razón, que el formato de fecha ISO es YYYY-MM-DD HH:mm:ss. Con este formato, primero se comparan las partes más significativas y se compara por importancia descendente, incluso cuando se utiliza la representación de cadena.

Si realmente desea eliminar los segundos, sugiero reducir el valor en esa cantidad:

 WHERE scheduledtime - interval second(scheduledtime) second <= cast('2017-03-13 08:30:00' as datetime)
1
Psi 13 mar. 2017 a las 11:24

Prueba esto

SELECT * FROM fp_mail_reminder
WHERE DATE_FORMAT(scheduledtime, '%Y-%m-%d %k:%i') <= DATE_FORMAT('2017-03-13 08:30:00', '%Y-%m-%d %k:%i')
AND active = 1
ORDER BY id ASC
0
Sumon Sarker 13 mar. 2017 a las 11:19