2011-01-13 15 views
38

Esto parece estúpido, pero, simplemente necesito una lista de fechas para ordenar con la fecha más reciente en la parte superior. El uso de order by DESC no parece funcionar como yo quiero.Ordenando por fecha descendente - mes, día y año

SELECT  * 
FROM   vw_view 
ORDER BY EventDate DESC 

Me da la fecha ordenada por mes y por día, pero no toma el año en consideración. por ejemplo:

12/31/2009 

12/31/2008 

12/30/2009 

12/29/2009 

necesita ser más como:

12/31/2009 

12/30/2009 

12/29/2009 

12/28/2009 

y así sucesivamente.

+3

¿Cuál es el tipo de datos de la columna 'EventDate'? –

+2

Y el tipo de DB también sería bueno –

+2

¿Por qué no actualizar su diseño de tabla y hacerlo correcto, usando un campo de fecha? Usar soluciones para un diseño pobre no es un buen camino. –

Respuesta

53

supongo EventDate es un char o varchar y no una fecha de lo contrario su orden por cláusula estaría bien.

Puede utilizar CONVERT para cambiar los valores para una fecha y ordenar por que

SELECT * 
FROM 
    vw_view 
ORDER BY 
    CONVERT(DateTime, EventDate,101) DESC 

El problema con esto es que, como señala Sparky en los comentarios, si EVENTDATE tiene un valor que no puede ser convertido a una fecha en que la consulta no se ejecutará.

Esto significa que debe o bien excluir las malas filas o dejar que los malos filas van a la parte inferior de los resultados

Para excluir las malas filas sólo tiene que añadir WHERE IsDate(EventDate) = 1

dejar dejando las malas fechas van a la abajo necesita usar CASE

por ej.

ORDER BY 
    CASE 
     WHEN IsDate(EventDate) = 1 THEN CONVERT(DateTime, EventDate,101) 
     ELSE null 
    END DESC 
+0

¡esto funciona perfectamente, gracias! estuvo en lo cierto al suponer que es el servidor SQL y EventDate se establece como varchar – user570457

+0

@ user570457. No hay problema. Actualicé tus etiquetas para incluir SQL-Server. Es una buena idea incluirlo en la próxima pregunta. –

+2

Una advertencia, si alguna de las fechas no es válida, SQL devolverá un error en la conversión, haciendo que su consulta sea inválida. Puede ser frustrante ya que tiene que averiguar qué fecha está causando el problema. Puede usar IsDate() = 0 para ver si tiene alguna fecha no válida de la que preocuparse – Sparky

17

Probar: (. Por usuario anónimo)

ORDER BY MONTH(Date),DAY(DATE) 

EDITAR

creo que este post se hace con, sin embargo este usuario anterior ha dado con algo que se resolvió mi problema sobre todos los demás.

Si alguien tiene problemas con las otras soluciones, intente con un mod menor del código anterior.

ORDER BY YEAR(Date) DESC, MONTH(Date) DESC, DAY(DATE) DESC 

Este fue mi enfoque final y funcionó perfectamente en un JET DB.

PS. Espero que nadie esté realmente usando Date como su nombre de campo ;-)

+0

¡Este es el resultado que los OP dicen que están obteniendo y que no quieren! –

+0

lol, Parece que malinterpreté la pregunta y todavía obtuve 2 votos! –

+0

Gracias, ahorras mi tiempo :) –

4

cuál es el tipo del campo EventDate, ya que el orden no es correcto, supongo que no lo tiene configurado en alguna fecha/hora que represente el tipo , pero una cadena. Y luego, la manera americana de escribir fechas es desagradable para ordenar

+0

quien configuró esto tenía el EventDate configurado como varchar por alguna razón:/ – user570457

3

Si reestructuró su formato de fecha en AAAA/MM/DD entonces puede usar este simple orden de cadenas para lograr el formateo que necesita.

alternativa, usando el comando SUBSTR(store_name,start,length) usted debería ser capaz de reestructurar el término clasificación en el formato anterior

tal vez utilizando el siguiente

SELECT  * 
FROM   vw_view 
ORDER BY SUBSTR(EventDate,6,4) + SUBSTR(EventDate, 0, 5) DESC 
6

Usted tiene el campo en una cadena, por lo que necesita para convertirlo en fecha y hora

order by CONVERT(datetime, EventDate) desc 
3

Asumiendo que usted tiene el poder de hacer cambios de esquema la única respuesta aceptable a esta pregunta OMI es cambiar el tipo de datos base a algo más apropiado (por ejemplo, date si SQL Server 2008).

Almacenar fechas como mm/dd/yyyy cadenas es espacio ineficaz, difícil de validar correctamente y hace los cálculos de clasificación y fecha innecesariamente doloroso.

Cuestiones relacionadas