¿Cómo obtener la primera fecha del mes en Oracle?

Cómo Obtener la Primera Fecha del Mes en Oracle

04/06/2025

Valoración: 4.05 (7091 votos)

La manipulación eficiente de fechas es una habilidad fundamental para cualquier desarrollador o analista que trabaje con bases de datos Oracle. Ya sea para generar informes financieros, calcular plazos de facturación, o programar eventos, la capacidad de extraer y transformar componentes de fechas es crucial. Una de las necesidades más comunes es la de obtener el primer día del mes a partir de una fecha dada. Este artículo explorará en profundidad diversas aproximaciones para lograr esta tarea en PL/SQL, proporcionando métodos completos y ejemplos prácticos para manejar la manipulación de fechas de manera efectiva.

¿Cómo sacar el mes de una fecha en SQL Oracle?
Usar la función MONTH() es la forma más sencilla de extraer la parte correspondiente al mes de una fecha en SQL. La función MONTH() toma un argumento, la fecha, y devuelve la parte correspondiente al mes de la fecha especificada.

Comprender cómo extraer el primer día del mes no solo optimiza tus consultas y programas, sino que también garantiza la precisión en la lógica de negocio que depende de periodos mensuales. A lo largo de este artículo, desglosaremos las funciones clave de Oracle que te permitirán realizar esta operación con facilidad, comparando sus ventajas y desventajas para que puedas elegir la mejor herramienta para cada escenario.

Índice de Contenido

Métodos Principales para Obtener el Primer Día del Mes

Cuando se trabaja con fechas en PL/SQL, extraer el primer día del mes de una fecha determinada es una operación esencial para muchas aplicaciones. Para abordar esta necesidad, discutiremos tres enfoques principales, cada uno con sus propias características y casos de uso ideales.

Enfoque 1: Usando la Función TRUNC()

La función TRUNC() es, con diferencia, el enfoque más simple, conciso y comúnmente utilizado para obtener el primer día del mes en PL/SQL. Esta función tiene la capacidad de truncar una fecha a una unidad específica (como día, mes o año), lo que permite extraer solo la porción deseada de la fecha de manera directa y eficiente.

Sintaxis de TRUNC()

La sintaxis para truncar una fecha al inicio del mes es la siguiente:

TRUNC(date_expression, 'MONTH')
  • date_expression: Es la fecha de la cual se desea extraer el primer día del mes. Puede ser una columna de tipo DATE, una variable o una función como SYSDATE.
  • 'MONTH': Es la unidad a la que se debe truncar la fecha. Al especificar 'MONTH', la función devuelve el primer día del mes de la fecha proporcionada, con la hora establecida a las 00:00:00.

Ejemplo Práctico con TRUNC()

En este ejemplo, la fecha actual del sistema (SYSDATE) se trunca al primer día del mes utilizando la función TRUNC. El resultado se muestra utilizando DBMS_OUTPUT.PUT_LINE.

DECLARE first_day DATE; BEGIN first_day := TRUNC(SYSDATE, 'MONTH'); DBMS_OUTPUT.PUT_LINE('Primer día del mes: ' || TO_CHAR(first_day, 'DD-MON-YYYY HH24:MI:SS')); END; /

Explicación

La función TRUNC() se utiliza para truncar la fecha dada a la unidad especificada, en este caso, 'MONTH'. Esto asegura que solo el primer día del mes permanezca, estableciendo el día a '01' y la hora a '00:00:00'.

  • Utilizamos la función SYSDATE para obtener la fecha y hora actuales del sistema.
  • Aplicamos TRUNC(SYSDATE, 'MONTH') para obtener el primer día del mes actual.
  • La fecha resultante se asigna a la variable first_day.
  • Finalmente, se muestra el valor de first_day utilizando DBMS_OUTPUT.PUT_LINE().
  • La función TO_CHAR() se emplea para formatear la fecha en el formato de salida deseado (DD-MON-YYYY HH24:MI:SS), lo que permite visualizar claramente que la hora se ha establecido a medianoche.

Este método es el más recomendado por su claridad, concisión y excelente rendimiento.

¿Cómo obtener la fecha de inicio y finalización del mes en Oracle?
Último y primero del mes La función LAST_DAY devuelve la fecha del último día del mes de la fecha proporcionada (hoy) . Este caso es menos obvio: la función TRUNC truncará la fecha proporcionada a solo el mes y el año, perdiendo el día. Una fecha sin día se proporcionará con el día 1 por defecto.

Enfoque 2: Usando la Función EXTRACT()

La función EXTRACT() permite extraer componentes específicos (como el año o el mes) de una fecha. Puedes usarla para construir el primer día del mes extrayendo el año y el mes y combinándolos con un valor de día fijo (01). Este enfoque es más verboso que TRUNC(), pero demuestra una forma diferente de manipular los componentes de una fecha.

Sintaxis de EXTRACT()

La sintaxis para construir el primer día del mes utilizando EXTRACT() implica concatenación y conversión:

TO_DATE( EXTRACT(YEAR FROM date_expression) || '-' || EXTRACT(MONTH FROM date_expression) || '-01', 'YYYY-MM-DD' )
  • EXTRACT(YEAR FROM date_expression): Recupera el componente del año de la fecha.
  • EXTRACT(MONTH FROM date_expression): Recupera el componente del mes de la fecha.
  • TO_DATE(): Convierte la cadena concatenada en un tipo de dato DATE. Es crucial que el formato de la cadena coincida con el formato especificado en TO_DATE.

Ejemplo Práctico con EXTRACT()

DECLARE month_num NUMBER; year_num NUMBER; first_day DATE; BEGIN SELECT EXTRACT(MONTH FROM SYSDATE) INTO month_num FROM DUAL; SELECT EXTRACT(YEAR FROM SYSDATE) INTO year_num FROM DUAL; first_day := TO_DATE('01-' || LPAD(month_num, 2, '0') || '-' || year_num, 'DD-MM-YYYY'); DBMS_OUTPUT.PUT_LINE('Primer día del mes: ' || TO_CHAR(first_day, 'DD-MON-YYYY HH24:MI:SS')); END; /

Explicación

En este método, la función EXTRACT() se utiliza para extraer los componentes del mes y el año de la fecha actual del sistema.

  • Extraemos el número del mes y el año de SYSDATE.
  • Luego, construimos una nueva cadena de fecha con el primer día del mes utilizando estos valores extraídos ('01-' || month_num || '-' || year_num). Se utiliza LPAD(month_num, 2, '0') para asegurar que el número del mes siempre tenga dos dígitos (ej. 01, 02, etc.), lo cual es una buena práctica para la conversión a fecha.
  • Esta cadena de fecha construida se convierte de nuevo a un tipo de dato DATE utilizando la función TO_DATE(), especificando el formato 'DD-MM-YYYY'.
  • Finalmente, la variable first_day se muestra utilizando DBMS_OUTPUT.PUT_LINE() después de formatearla con TO_CHAR().

Este enfoque es más granular y útil cuando se necesitan los componentes individuales de la fecha para otras operaciones antes de reconstruir la fecha.

Enfoque 3: Usando la Función TO_CHAR()

La función TO_CHAR() se puede utilizar para formatear una fecha y extraer componentes específicos (como el mes y el año) como una cadena de caracteres. Al concatenar estos componentes con un valor de día fijo, puedes construir el primer día del mes. Al igual que EXTRACT(), este método también requiere una conversión posterior a tipo DATE.

Sintaxis de TO_CHAR()

La sintaxis para este enfoque es similar a la de EXTRACT(), combinando el formato y la conversión:

TO_DATE('01-' || TO_CHAR(date_expression, 'MM-YYYY'), 'DD-MM-YYYY')
  • TO_CHAR(date_expression, 'MM-YYYY'): Formatea la fecha para devolver el mes y el año como una cadena (ej. '06-2024').
  • TO_DATE(): Convierte la cadena construida de nuevo a un tipo DATE.

Ejemplo Práctico con TO_CHAR()

DECLARE first_day DATE; BEGIN first_day := TO_DATE('01-' || TO_CHAR(SYSDATE, 'MM-YYYY'), 'DD-MM-YYYY'); DBMS_OUTPUT.PUT_LINE('Primer día del mes: ' || TO_CHAR(first_day, 'DD-MON-YYYY HH24:MI:SS')); END; /

Explicación

En este enfoque, la función TO_CHAR() se utiliza para formatear la fecha actual del sistema y extraer los componentes del mes y el año como una cadena.

  • Concatenamos '01-' con el mes y el año obtenidos de TO_CHAR(SYSDATE, 'MM-YYYY') para formar una cadena que representa el primer día del mes (ej. '01-06-2024').
  • Esta cadena se convierte luego a un tipo de dato DATE utilizando la función TO_DATE(), especificando el formato 'DD-MM-YYYY'.
  • Finalmente, la variable first_day se muestra utilizando DBMS_OUTPUT.PUT_LINE() después de formatearla con TO_CHAR().

Este método es una alternativa viable, aunque TRUNC() sigue siendo más directo.

¿Qué es Sysdate 1?
- sysdate: retorna la fecha y hora actuales en el servidor de Oracle. -systimestamp: retorna fecha y hora actuales. - to_char: convierte una fecha a cadena de caracteres.

Comparación de Enfoques y Mejores Prácticas

Para ayudarte a decidir qué enfoque utilizar, aquí tienes una tabla comparativa que resume las características clave de cada método:

CaracterísticaTRUNC()EXTRACT()TO_CHAR()
Simplicidad del CódigoMuy Alta (Una sola función)Media (Múltiples extracciones y concatenación)Media (Formateo y concatenación)
RendimientoGeneralmente el más eficienteBueno (Puede ser ligeramente menos eficiente por las múltiples operaciones)Bueno (Puede ser ligeramente menos eficiente por las conversiones a cadena y luego a fecha)
LegibilidadExcelente (Intuitivo)Buena (Aunque más extenso)Buena (Aunque más extenso)
Tipo de Retorno IntermedioDATENUMBER (para EXTRACT), luego VARCHAR2 (para concatenación)VARCHAR2 (para TO_CHAR)
Necesidad de TO_DATE()No
Caso de Uso PrincipalObtener el inicio/fin de periodos de tiempo (día, semana, mes, año)Construir fechas a partir de componentes individuales o realizar lógica basada en ellosFormatear fechas para mostrar, o reconstruir fechas a partir de formatos específicos

Basado en la comparación, la función TRUNC(fecha, 'MONTH') es la opción más recomendada para obtener el primer día del mes en Oracle debido a su simplicidad, claridad y eficiencia. Las otras dos opciones son válidas y pueden ser útiles en contextos donde ya estés extrayendo componentes o formateando fechas por otras razones, pero para la tarea específica de obtener el primer día del mes, TRUNC() es superior.

Cómo Obtener la Última Fecha del Mes en Oracle

Complementando la obtención del primer día, es igualmente común necesitar el último día del mes. Oracle proporciona una función dedicada para esto, que es tan sencilla como TRUNC():

Usando la Función LAST_DAY()

La función LAST_DAY() devuelve la fecha del último día del mes de una fecha dada. Mantiene la misma hora que la fecha de entrada.

Sintaxis de LAST_DAY()

LAST_DAY(date_expression)

Ejemplo Práctico con LAST_DAY()

DECLARE last_day DATE; BEGIN last_day := LAST_DAY(SYSDATE); DBMS_OUTPUT.PUT_LINE('Último día del mes: ' || TO_CHAR(last_day, 'DD-MON-YYYY HH24:MI:SS')); END; /

Si la fecha de entrada fuera '15-FEB-2024', LAST_DAY('15-FEB-2024') retornaría '29-FEB-2024'. Si fuera '10-AUG-2024', retornaría '31-AUG-2024'.

Obtener el Primer y Último Día de un Mes Específico (Parametrizado)

Los ejemplos anteriores utilizan SYSDATE para el mes actual. Sin embargo, en escenarios reales, a menudo necesitarás obtener el primer o último día de un mes específico, proporcionado como un parámetro. Esto es tan simple como reemplazar SYSDATE por la fecha deseada.

Ejemplo Parametrizado

DECLARE p_some_date DATE := TO_DATE('17-MAR-2023', 'DD-MON-YYYY'); -- Fecha de ejemplo first_day DATE; last_day DATE; BEGIN first_day := TRUNC(p_some_date, 'MONTH'); last_day := LAST_DAY(p_some_date); DBMS_OUTPUT.PUT_LINE('Para la fecha: ' || TO_CHAR(p_some_date, 'DD-MON-YYYY')); DBMS_OUTPUT.PUT_LINE('Primer día del mes: ' || TO_CHAR(first_day, 'DD-MON-YYYY HH24:MI:SS')); DBMS_OUTPUT.PUT_LINE('Último día del mes: ' || TO_CHAR(last_day, 'DD-MON-YYYY HH24:MI:SS')); END; /

Funciones de Fecha Adicionales Útiles en Oracle

Oracle ofrece un rico conjunto de funciones para la manipulación de fechas, que son esenciales para cualquier aplicación que gestione datos temporales. Además de las ya mencionadas, aquí hay algunas otras funciones importantes:

  • ADD_MONTHS(fecha, n): Agrega o resta un número de meses a una fecha. Si n es positivo, suma; si es negativo, resta. Por ejemplo, ADD_MONTHS(SYSDATE, 1) te daría la fecha de hoy el próximo mes.
  • MONTHS_BETWEEN(fecha1, fecha2): Retorna el número de meses entre dos fechas. Puede retornar un valor decimal si la diferencia no es un número entero de meses.
  • NEXT_DAY(fecha, día_de_la_semana): Retorna la fecha del primer día de la semana especificado después de la fecha dada. Por ejemplo, NEXT_DAY(SYSDATE, 'LUNES') daría la fecha del próximo lunes.
  • SYSDATE: Retorna la fecha y hora actuales del servidor de la base de datos. Es la más utilizada para obtener la fecha y hora 'ahora'.
  • CURRENT_DATE: Retorna la fecha y hora actuales de la sesión del usuario, en la zona horaria de la sesión. Puede ser diferente de SYSDATE si el servidor y la sesión tienen zonas horarias distintas.
  • SYSTIMESTAMP y CURRENT_TIMESTAMP: Similares a SYSDATE y CURRENT_DATE, pero retornan un tipo de dato TIMESTAMP WITH TIME ZONE, ofreciendo mayor precisión (fracciones de segundo) y la información de la zona horaria.
  • Operadores Aritméticos con Fechas: Puedes sumar o restar números a las fechas. Sumar un número a una fecha agrega ese número de días. Restar dos fechas devuelve la diferencia en días. Por ejemplo, SYSDATE - 7 te daría la fecha de hace una semana.

Aplicaciones Prácticas y Casos de Uso

La capacidad de obtener el primer día del mes es fundamental en numerosos escenarios empresariales y de desarrollo:

  • Informes Financieros y Contables: Generar informes mensuales de ventas, gastos, ganancias o balances que deben comenzar estrictamente desde el primer día del mes.
  • Cálculo de Antigüedad y Periodos de Facturación: Determinar la antigüedad de cuentas, inventarios o empleados desde el inicio de un mes específico, o calcular periodos de facturación que siempre empiezan el día 1.
  • Programación de Tareas y Eventos: Establecer programaciones recurrentes que se activan al inicio de cada mes, como la ejecución de scripts de limpieza o el envío de recordatorios.
  • Análisis de Datos Temporales: Agrupar datos por mes para análisis de tendencias, donde cada grupo debe estar anclado al inicio de su respectivo mes.
  • Particionamiento de Tablas: En bases de datos muy grandes, las tablas a menudo se particionan por rango de fechas, y el primer día del mes es un punto de corte lógico para estas particiones.

Preguntas Frecuentes (FAQs)

¿Cuál es la función más recomendada para obtener el primer día del mes en Oracle?

La función TRUNC(fecha, 'MONTH') es la más recomendada. Es concisa, fácil de entender y generalmente la más eficiente para esta tarea específica.

¿Puedo obtener el primer día de un mes que no sea el actual?

Sí, absolutamente. En lugar de usar SYSDATE, simplemente pasa la fecha deseada como argumento a las funciones. Por ejemplo, TRUNC(TO_DATE('15-OCT-2023', 'DD-MON-YYYY'), 'MONTH') te dará el 1 de octubre de 2023.

¿Cómo obtener la primera fecha del mes en Oracle?
En el ejemplo, usamos la función SYSDATE para obtener la fecha actual del sistema. Luego, aplicamos TRUNC(SYSDATE, 'MONTH') para obtener el primer día del mes actual. La fecha resultante se asigna a la variable first_day, que se muestra mediante DBMS_OUTPUT.

¿Cómo obtengo el último día del mes en Oracle?

Utiliza la función LAST_DAY(fecha). Por ejemplo, LAST_DAY(SYSDATE) te dará el último día del mes actual.

¿Qué diferencia hay entre SYSDATE y CURRENT_DATE?

SYSDATE devuelve la fecha y hora del sistema operativo del servidor de la base de datos. CURRENT_DATE devuelve la fecha y hora de la sesión del usuario, en la zona horaria de la sesión. Para la mayoría de las aplicaciones, la diferencia es insignificante a menos que se manejen zonas horarias de forma explícita o se tenga una arquitectura de servidor distribuida.

¿Qué es la tabla DUAL y por qué se usa en los ejemplos?

DUAL es una tabla ficticia y especial en Oracle. Tiene una única columna (`DUMMY`) y una única fila, y se utiliza principalmente para ejecutar consultas que no necesitan acceder a datos de tablas reales, como obtener el valor de una función (ej., SELECT SYSDATE FROM DUAL;) o una expresión, o para probar funciones PL/SQL.

¿Es posible obtener el primer día de la semana en Oracle?

Sí, al igual que con los meses, puedes usar TRUNC(). La sintaxis es TRUNC(fecha, 'IW') para el inicio de la semana ISO (Lunes como primer día) o TRUNC(fecha, 'WW') para el inicio de la semana del año (basado en el 1 de enero como el primer día de la primera semana, o 'W' para el día de la semana del mes).

Conclusión

Saber cómo obtener el primer día del mes en Oracle es una habilidad indispensable para cualquier operación relacionada con fechas, desde la generación de informes hasta la gestión de ciclos de facturación y la programación de tareas. Este artículo ha cubierto las tres aproximaciones principales para lograrlo:

  • El uso de la función TRUNC(): La forma más simple, eficiente y recomendada para obtener el primer día del mes.
  • El uso de la función EXTRACT(): Útil para construir fechas dinámicamente a partir de sus componentes.
  • El uso de la función TO_CHAR(): Permite un formateo personalizado de fechas y su posterior reconstrucción.

Aunque los tres métodos son válidos, la función TRUNC(fecha, 'MONTH') se destaca por su claridad y rendimiento. Al dominar estas técnicas, estarás mejor equipado para manejar eficientemente la lógica de negocio basada en fechas en tus aplicaciones Oracle, asegurando precisión y optimización en tus procesos.

Si quieres conocer otros artículos parecidos a Cómo Obtener la Primera Fecha del Mes en Oracle puedes visitar la categoría Cálculos.

Subir