ORDENAR POR FECHA mostrando NULOS primero luego las fechas más recientes
-
03-07-2019 - |
Pregunta
Tengo un procedimiento almacenado que ejecuta una instrucción select. Me gustaría ordenar mis resultados por un campo de fecha y mostrar todos los registros con fechas NULAS primero y luego las fechas más recientes.
La declaración se ve así:
SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY [Submission Date] ASC
Ahora, esto mostrará primero todos los registros con fechas de envío NULL, pero cuando llego a las filas que tienen valores de fecha, no son las fechas más recientes en la vista.
Si reemplazo ASC con DESC, entonces obtengo las fechas en el orden que quiero, pero los valores NULL están en la parte inferior de mi conjunto de resultados.
¿Hay alguna forma de estructurar mi consulta para que pueda mostrar los valores nulos en la parte superior y luego cuando hay valores de fecha, para ordenar que desciendan de más recientes a más antiguos?
Solución
@Chris, casi lo tienes.
ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC,
[Submission Date] DESC
[Editar: #Eppz me pidió que modifique el código anterior como se muestra actualmente]
Personalmente prefiero esto mucho mejor que crear "números mágicos". Los números mágicos son casi siempre un problema a la espera de suceder.
Otros consejos
Puede hacer algo como esto ponga los NULL en la parte inferior:
ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC
El SQL estándar (ISO / IEC 9075-2: 2003 o posterior - 2008) proporciona:
ORDER BY SomeColumn NULLS FIRST
La mayoría de los DBMS aún no lo admiten, AFAIK.
prueba
SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC
OrderBy="ColumnName = NULL desc, ColumnName desc"
prueba esto
SELECCIONE a, b, c, [Fecha de envío] DESDE someView ORDENAR POR isnull ([Fecha de envío], emitido ('1770/01/01' como fecha y hora)) ASC
Sé que esto es viejo, pero cuando lo encontré, noté la solución aceptada, https://stackoverflow.com/a/ 821856/7177892 , podría simplificarse haciendo que el resultado de la declaración CASE sea hoy (GETDATE ()) o la fecha real.
Original:
ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC,
[Submission Date] DESC
Simplificado:
ORDER BY (CASE WHEN [Submission Date] IS NULL
THEN GETDATE()
ELSE [Submission Date]
END) DESC