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

Order By no me ordena...

Estas en el tema de Order By no me ordena... en el foro de Mysql en Foros del Web. Hola comunidad, miren: Hago una consulta SQL desde PHP, que funciona correctamente (es decir la sintaxis está bien). Pero el resultado no es muy satisfactorio. ...
  #1 (permalink)  
Antiguo 07/06/2009, 12:01
 
Fecha de Ingreso: marzo-2009
Mensajes: 8
Antigüedad: 15 años
Puntos: 0
Busqueda Order By no me ordena...

Hola comunidad, miren:
Hago una consulta SQL desde PHP, que funciona correctamente (es decir la sintaxis está bien).
Pero el resultado no es muy satisfactorio.
Tengo en los registros una columna llamada hora, que no he guardado como date sino como varchar. Tambien tengo un campo fecha que sí que es un date.

Ordeno la consulta con Order By fecha y hora, y si por ejemplo tengo estos registros como hora:

9:15
10:30
18:45
20:00

me los ordena así en ascendente:

10:30
18:45
20:00
9:15
¡Las 9 al final!
como es varchar, he probado a utilizar en lugar de cuatro caracteres (9:00), cinco (09:00), y así si que funciona. Pero el código me peta por todos lados porque reconoce un 0 o hace lo que le viene en gana.
¿Hay alguna forma de que se ordenen los campos varchar bien en esta consulta?
Si no me veré obligado a modificar mucho código...
Gracias!!
  #2 (permalink)  
Antiguo 07/06/2009, 13:08
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: Order By no me ordena...

Siendo un VARCHAR te las ordena alfabéticamente (¿por qúe no usaste una columna TIME, en lugar de un VARCHAR?).
La única solución que tienes es hacer que la guarde en el formato "00:00", es decir, con la hora con dos caracteres, siempre.
__________________
¿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 07/06/2009, 17:28
 
Fecha de Ingreso: marzo-2004
Mensajes: 32
Antigüedad: 20 años
Puntos: 0
Respuesta: Order By no me ordena...

La sentencia SELECT TIME_FORMAT('9:12','%H:%i') da como resultado 09:12, con lo cual te saldría bien ordenado, sólo te quedaría quitar el primer caracter si es cero que eso mediante código lo podrías hacer fácilmente.
  #4 (permalink)  
Antiguo 08/06/2009, 00:49
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Order By no me ordena...

Yo estoy con gnzsoloyo, lo mejor es hacer las horas horas, minutos y segundos, es decir, TIME. Pero si eso te supone un problema tan grande la solución de alexisns podría servirte, aunque adaptada para ordenar, y si quieres poner hora en el select para que te muestre la hora tal cual la tienes, es decir, sin 0 por delante:
Código sql:
Ver original
  1. SELECT fecha, hora FROM tabla ORDER BY fecha, TIME_FORMAT(hora,'%H:%i')

De todas formas y para el futuro, un consejo, el que te ha dado gnzsoloyo: un campo de tiempo debe ser del tipo time, con el formato de ese tipo de campos, porque, por poner un ejemplo, imagina que quisieras hacer un sumatorio de tiempo...; tendrías que recurrir a conversiones como ésta que ralentizan todas las operaciones y que serían innecesarias si hubieras previsto la situación.

Última edición por jurena; 08/06/2009 a las 00:56
  #5 (permalink)  
Antiguo 08/06/2009, 03:57
 
Fecha de Ingreso: marzo-2004
Mensajes: 32
Antigüedad: 20 años
Puntos: 0
Respuesta: Order By no me ordena...

jurena gracias por montar la consulta, siempre que me paso por aquí sigo aprendiendo, pues hubiera puesto TIME_FORMAT en el SELECT y repetido en el ORDER BY, con lo que ahora te lo ordenará directamente sin el 0 delante, no?
  #6 (permalink)  
Antiguo 08/06/2009, 05:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Order By no me ordena...

Sí, alexisns, ordenará bien y mostrará lo que tengas introducido tal cual. Yo, personalmente, prefiero en estos casos una salida de tiempo con el 0 delante, 09:05 y no 9:05, y mucho peor si tienes 9:5, y 9:50 para diferenciar 09:05 de 09:50, porque te dará problemas. Para sacarlo como te estoy diciendo y ordenar bien, bastará con usar la función tanto el el select como en el order by. Pero no quiero acabar sin repetir que lo suyo es guardar los datos en un campo time, aunque entiendo que bases que funcionan bien, que ya tienen muchos datos y una programación muy elaborada que contempla esa circunstancia, mejor no tocarlas, al menos si es sólo para ordenar.
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 20:02.