08 octubre 2018

Mostrar todos los días de un año en Oracle


Oracle es una motores de Base de Datos más extendidos y potentes que existen la actualidad, conocer su lenguaje de consultas (SQL) es fundamental para realizar aplicaciones sobre Base de datos lo mas optimizadas posible.

Por eso hoy os muestro una consulta, que me ha sido de mucha ayuda, que permite mostrar todos los días del año generados desde el propio Oracle. Si bien podemos crear los tramos de fechas en nuestra aplicación y lanzar las consultas sobre la BD con esos tramos, muchas veces nos será mas útil realizar esa acción desde una única consulta.



La siguiente consulta nos daría todos los días de un año 2018.


(SELECT  TO_CHAR( TO_DATE('01/01/18', 'dd/mm/YY' )-1+X,'dd/mm/YY') dia FROM
(SELECT ROWNUM x /*+ INDEX( CBRA )*/ FROM DUAL CONNECT BY LEVEL<=366) where to_char(TO_DATE('01/01/18', 'dd/mm/YY' )-1+X,'YYYY')=2018);

Básicamente los que hacemos a la fecha inicial del año ir sumando del 1 al 366 el valor de la fila ROWNUM que sale de la subconsulta. El 366 es por si es bisiesto, y para que no genere de otro año, en que caso de que no lo sea, se añade la parte final del where, para que solo saque las fechas de ese año.

Si queremos sacar mas información, para generar, por ejemplo un calendario de trabajo, podemos hacer lo siguiente:
  
SELECT dia,TO_CHAR( TO_DATE(dia, 'dd/mm/YY' ),'D') AS DIASEM,(CASE WHEN semana = '6' or semana = '7' THEN 'S' ELSE 'N' END) AS FINDESEMANA  FROM
 ( SELECT  TO_CHAR( TO_DATE('01/01/18', 'dd/mm/YY' )-1+X,'dd/mm/YY') dia,TO_CHAR( TO_DATE('01/01/18', 'dd/mm/YY' )-1+X,'D') AS SEMANA FROM
(SELECT ROWNUM x /*+ INDEX( CBRA )*/ FROM DUAL CONNECT BY LEVEL<=366));


Esto nos muestra el días de la semana, 1- lunes, 2-martes … (depende de la configuración de Oracle) y si es fin de semana o no.

Dando una vuelta de tuerca, podemos utilizarla como subconsulta para comparar algún dato de nuestra lógica de negocio con respecto a los días de la semana, por ejemplo.

No hay comentarios: