Identificar días hábiles con la función TO_CHAR() de Oracle
El siguiente ejemplo muestra cómo usar TO_CHAR() para devolver solo las filas cuya fecha cae en un día hábil.
SELECT order_id, order_date
FROM orders
WHERE TO_CHAR(order_date, 'DY') NOT IN ('SAT', 'SUN');
Resultado esperado:
ORDER_ID | ORDER_DATE
---------|------------
1001 | 04-SEP-2023
1002 | 05-SEP-2023
1005 | 06-SEP-2023
1010 | 07-SEP-2023
En esta consulta:
-
TO_CHAR(order_date, 'DY')extrae el nombre abreviado del día de la columna order_date. - La cláusula
NOT IN ('SAT', 'SUN')descarta las filas en las que el día es sábado o domingo.
Trabajar con nombres completos de los días
Si tu base de datos usa una configuración regional donde los nombres abreviados de los días son distintos, o prefieres trabajar con los nombres completos, puedes modificar la consulta así:
SELECT employee_id, work_date
FROM employee_schedule
WHERE TO_CHAR(work_date, 'DAY') NOT IN ('SATURDAY', 'SUNDAY');
Resultado esperado:
EMPLOYEE_ID | WORK_DATE
------------|-----------
200 | 01-SEP-2023
201 | 02-SEP-2023
202 | 03-SEP-2023
Filtrar días hábiles entre dos fechas
Muchas veces vas a querer obtener registros entre dos fechas, pero solo de días hábiles. Así puedes extender la lógica para lograrlo.
Consulta de ejemplo: seleccionar días hábiles entre dos fechas
SELECT invoice_id, invoice_date
FROM invoices
WHERE invoice_date BETWEEN TO_DATE('2023-09-01', 'YYYY-MM-DD')
AND TO_DATE('2023-09-10', 'YYYY-MM-DD')
AND TO_CHAR(invoice_date, 'DY') NOT IN ('SAT', 'SUN');
Resultado esperado:
INVOICE_ID | INVOICE_DATE
-----------|--------------
3001 | 01-SEP-2023
3005 | 04-SEP-2023
3007 | 05-SEP-2023
3010 | 06-SEP-2023
Manejo de distintos idiomas y configuraciones regionales
Oracle puede mostrar los nombres de los días según la configuración NLS (National Language Support) de tu sesión. Por ejemplo, si tu sesión está configurada en un idioma distinto al inglés, las abreviaturas como ‘MON’, ‘TUE’ pueden ser diferentes. Puedes revisar la configuración actual ejecutando:
SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_TERRITORY';
Si es necesario, puedes sobrescribir esta configuración a nivel de sesión para obtener resultados consistentes:
ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
Esto establece el territorio en ‘AMERICA’, lo que garantiza que se usen nombres de días como ‘MON’, ‘TUE’, etc.
Uso de la función NEXT_DAY()
A veces querrás calcular el siguiente día de la semana a partir de una fecha dada. La función NEXT_DAY() de Oracle te ayuda a encontrar la siguiente ocurrencia de un día de la semana específico.
Consulta de ejemplo: encontrar el siguiente día hábil
SELECT NEXT_DAY(SYSDATE, 'MONDAY') AS next_monday
FROM dual;
Resultado esperado:
NEXT_MONDAY
------------
11-SEP-2023
En este caso, NEXT_DAY(SYSDATE, 'MONDAY') devuelve el siguiente ‘lunes’ después de la fecha actual.
Conclusión
Filtrar días hábiles en Oracle SQL es un requisito común en muchas aplicaciones. Con la función TO_CHAR() para extraer el día de la semana y excluir los fines de semana, puedes trabajar solo con días hábiles. En escenarios más complejos, puedes combinar funciones como NEXT_DAY() y rangos de fechas para crear consultas más sofisticadas.
Otros artículos que te pueden gustar:
Beekeeper Studio es un cliente de bases de datos gratuito y de código abierto
La mejor herramienta de consultas y edición de SQL que he usado. Tiene todo lo que necesito para administrar mi base de datos. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio es rápido, intuitivo y fácil de usar. Es compatible con muchísimas bases de datos y funciona de maravilla en Windows, Mac y Linux.
Lo que dicen los usuarios de Beekeeper Studio
"Beekeeper Studio reemplazó por completo mi antiguo flujo de trabajo con SQL. Es rápido, intuitivo y hace que trabajar con bases de datos vuelva a ser agradable."
"He probado muchas GUI de bases de datos, pero Beekeeper logra el equilibrio perfecto entre funciones y simplicidad. Simplemente funciona."