Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Datetime no arroja correctamente el resultado.

Estas en el tema de Datetime no arroja correctamente el resultado. en el foro de Mysql en Foros del Web. Hola, Tengo una duda con respecto al formato datetime de mysql. Estaba corriendo un query buscando un rango de horarios: (Query que me arrojó el ...
  #1 (permalink)  
Antiguo 21/10/2015, 22:15
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Exclamación Datetime no arroja correctamente el resultado.

Hola,

Tengo una duda con respecto al formato datetime de mysql.

Estaba corriendo un query buscando un rango de horarios:
(Query que me arrojó el motor de busqueda que tiene phpMyAdmin)

SELECT * FROM horarios WHERE `FECHA` BETWEEN '2015-08-14 01:00:00' AND '2015-08-24 01:02:00'

Lo raro es que me arroja resultados como:

2015-08-18 21:43:28
2015-08-18 21:46:31
2015-08-18 21:53:31
2015-08-18 22:50:07
2015-08-18 22:50:11
2015-08-18 22:50:16
2015-08-18 22:50:20

Si se dan cuenta la fecha la trae bien pero los horarios no, me trae de las 9pm cuando yo busco de 1am.

Recurri a armar el query desde el mismo phpMyAdmin ya que con el query que corria:

SELECT * FROM horarios WHERE `FECHA` BETWEEN STR_TO_DATE('2015-08-14 01:00:00','%Y-%m-%d %H:%i:%s') AND STR_TO_DATE('2015-08-24 01:02:00','%Y-%m-%d %H:%i:%s')

Me arrojaba lo mismo, cosa que pense que talvez estaba haciendo algo mal, pero el resultado era identico.

Alguien sabe porque no respeta el horario? me esta volviendo loco!
  #2 (permalink)  
Antiguo 22/10/2015, 05:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Datetime no arroja correctamente el resultado.

MySQL no comete errores en ese tipo de cosas . Si no devolvió datos e las 01:00:00 de un día dado, es que no existen en esa tabla para el rango de fecha indicado.
Lo primero que deberías hacer si quieres datos de una hora, es filtrar por el rango de horas y ver en que días se cumple.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 22/10/2015, 08:06
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Exclamación Respuesta: Datetime no arroja correctamente el resultado.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
MySQL no comete errores en ese tipo de cosas . Si no devolvió datos e las 01:00:00 de un día dado, es que no existen en esa tabla para el rango de fecha indicado.
Lo primero que deberías hacer si quieres datos de una hora, es filtrar por el rango de horas y ver en que días se cumple.
Mi duda es, si no cuenta con datos en ese rango de tiempo, porque muestra entonces resultados :S ? , puede que su algoritmo sea mostrar entonces la fecha que se cumpla, pero no se me hace una buena practica.

Y efectivamente mi proxima prueba seria solo filtrar por rango de tiempo a ver que pasa y de ahi tener que validar ahora la fecha (en validaciones separadas), pero ya no tuve tiempo ayer :S.
Solo que queria evitar esa doble valdiacón ya que se supone que mysql podria validar su campo datetime de formal completa (fecha - hora).
  #4 (permalink)  
Antiguo 22/10/2015, 13:42
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Datetime no arroja correctamente el resultado.

Hola marco64yes:

Tal como lo comenta gnzsoloyo, MySQL no hace "cosas raras" con las fechas... si una consulta no está regresando correctamente los datos entonces tienes un problema con los datos, no con la consulta. Checa este ejemplo, partiendo de los mismos datos que dices tener en tu tabla:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+---------------------+
  3. | id   | fecha               |
  4. +------+---------------------+
  5. |    1 | 2015-08-18 21:43:28 |
  6. |    2 | 2015-08-18 21:46:31 |
  7. |    3 | 2015-08-18 21:53:31 |
  8. |    4 | 2015-08-18 22:50:07 |
  9. |    5 | 2015-08-18 22:50:11 |
  10. |    6 | 2015-08-18 22:50:16 |
  11. |    7 | 2015-08-18 22:50:20 |
  12. +------+---------------------+
  13. 7 rows in set (0.02 sec)

Entonces, si quisieras mostrar sólo el rango entre las 21:45:00 y las 21:55:00, es decir, los id's 2 y 5, harías algo así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla
  2.     -> WHERE fecha
  3.     -> BETWEEN '2015-08-18 21:45:00' AND '2015-08-18 21:55:00';
  4. +------+---------------------+
  5. | id   | fecha               |
  6. +------+---------------------+
  7. |    2 | 2015-08-18 21:46:31 |
  8. |    3 | 2015-08-18 21:53:31 |
  9. +------+---------------------+
  10. 2 rows in set (0.00 sec)

Luego entonces, la consulta funciona y funciona bien. Ahora, hay varias cosas que deberías revisar aunque parezcan obvias:

1. De qué tipo de datos es tu campo fecha? puedo suponer que se trata de un tipo datetime, pero un error bastante común es poner los campos como varchar, esto hace que las comparaciones tengan un comportamiento distinto, pues las cadenas no siguen la ordenación de "numérica", sino alfabética.

2. Estás ejecutando la consulta directamente en una consola de MySQL o lo haces mediante algún lenguaje de programación? Si es esto último, el error puede estar en la forma en que ejecutas la sentencia, no tanto en la sentencia en si.

Saludos
Leo
  #5 (permalink)  
Antiguo 22/10/2015, 19:15
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Exclamación Respuesta: Datetime no arroja correctamente el resultado.

Que tal leo,

Muchas gracias por tu respuesta, mira hice una prueba usé tu mismo query y solo le cambie las fechas:

SELECT FECHA FROM horarios WHERE FECHA BETWEEN '2015-08-14 21:45:00' AND '2015-08-24 21:55:00'

2015-08-18 21:43:28
2015-08-18 21:46:31
2015-08-18 21:53:31
2015-08-18 22:50:07
2015-08-18 22:50:11
2015-08-18 22:50:16
2015-08-18 22:50:20
2015-08-18 22:50:23
2015-08-18 22:50:24
2015-08-18 22:50:25
2015-08-18 22:50:26
2015-08-18 22:50:26

2015-08-19 19:32:23
2015-08-19 19:33:05
2015-08-19 19:35:49
2015-08-19 19:36:26

Y efecticamente como les mencionaba el campo FECHA es tipo datetime

Por lo que tambien opte tambien en usar STR_TO_DATE como hago mención en el primer ejemplo, pero el resultado es el mismo tanto desde la ejecución en PHP como directo de phpMyAdmin (motor de cpanel para mysql).
  #6 (permalink)  
Antiguo 22/10/2015, 19:36
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: Datetime no arroja correctamente el resultado.

Bueno pues solo me funciono de la sig. manera:

SELECT FECHA FROM horarios WHERE FECHA BETWEEN STR_TO_DATE('2015-08-14','%Y-%m-%d') AND STR_TO_DATE('2015-08-24','%Y-%m-%d') AND TIME(FECHA) BETWEEN STR_TO_DATE('01:00:00','%H:%i:%s') AND STR_TO_DATE('01:02:00','%H:%i:%s')

O bien sin el STR_TO_DATE

SELECT FECHA FROM horarios WHERE
TIME(FECHA) BETWEEN '01:00:00' AND '01:02:00'

Pero lo tuve que hace por separado validar primero la fecha y luego los horarios...

Saludos

Última edición por marco64yes; 22/10/2015 a las 23:05
  #7 (permalink)  
Antiguo 22/10/2015, 23:09
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: Datetime no arroja correctamente el resultado.

Buscando encontré esta función:

DATE_FORMAT(FECHA, '%Y-%m-%d %H:%i:%s')

Por lo que debería de funcionar junto, no lo he podido probar ya que estoy ahora en otro asunto con otro sistema, pero luego les digo que pasó...

SELECT * FROM horarios WHERE DATE_FORMAT(FECHA, '%Y-%m-%d %H:%i:%s') BETWEEN STR_TO_DATE('2015-08-14 01:00:00','%Y-%m-%d %H:%i:%s') AND STR_TO_DATE('2015-08-24 01:02:00','%Y-%m-%d %H:%i:%s')

O bien lo pueden usar sin el STR_TO_DATE

Etiquetas: datetime
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:14.