Hola buenas tardes
Les pido ayuda con un tema.. tengo una tabla que esta ordenada por la fecha en forma asc,
11-06-2019 13:00
12-06-2019 10:00
12-06-2019 10:30
lo que necesito es que se ordene primero por la fecha actual o sea 12 de forma asc por orden de hora y que los dias anterioes queden al ultimo..algo asi
12-06-2019 10:00
12-06-2019 10:30
11-06-2019 13:00
Hola,
Para esto lo más claro es un ORDER BY con un CASE que separe primero las filas de hoy de las demás, y luego ordene por fecha dentro de cada grupo:
SELECT *
FROM tu_tabla
ORDER BY
CASE WHEN TRUNC(tu_fecha) = TRUNC(SYSDATE) THEN 0 ELSE 1 END,
tu_fecha ASC;
El CASE genera un 0 para las filas cuya fecha (sin la hora, por eso el TRUNC) coincide con el día actual, y un 1 para el resto. Como ORDER BY ordena ese valor primero, todas las filas de hoy quedan agrupadas al principio, y dentro de ese grupo el segundo criterio (tu_fecha ASC) las ordena por hora tal y como pides. Las filas de días anteriores caen todas al grupo «1» y quedan al final, ordenadas también entre ellas por fecha ascendente.
Con tu ejemplo de datos (12-06 son las de hoy, 11-06 es de ayer), el resultado sería exactamente el que pides:
12-06-2019 10:00
12-06-2019 10:30
11-06-2019 13:00
Si en vez de «hoy» en concreto lo que necesitas es algún otro criterio de agrupación (por ejemplo, la fecha más reciente presente en la tabla, no necesariamente SYSDATE), cambia la condición del CASE por una subconsulta que calcule esa fecha:
CASE WHEN TRUNC(tu_fecha) = (SELECT MAX(TRUNC(tu_fecha)) FROM tu_tabla) THEN 0 ELSE 1 END
Un saludo,
David Carrero