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:
Publicar un comentario