04/06/2025
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.

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.
- Métodos Principales para Obtener el Primer Día del Mes
- Comparación de Enfoques y Mejores Prácticas
- Cómo Obtener la Última Fecha del Mes en Oracle
- Obtener el Primer y Último Día de un Mes Específico (Parametrizado)
- Funciones de Fecha Adicionales Útiles en Oracle
- Aplicaciones Prácticas y Casos de Uso
- Preguntas Frecuentes (FAQs)
- ¿Cuál es la función más recomendada para obtener el primer día del mes en Oracle?
- ¿Puedo obtener el primer día de un mes que no sea el actual?
- ¿Cómo obtengo el último día del mes en Oracle?
- ¿Qué diferencia hay entre SYSDATE y CURRENT_DATE?
- ¿Qué es la tabla DUAL y por qué se usa en los ejemplos?
- ¿Es posible obtener el primer día de la semana en Oracle?
- Conclusión
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 tipoDATE, una variable o una función comoSYSDATE.'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
SYSDATEpara 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_dayutilizandoDBMS_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.

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 datoDATE. Es crucial que el formato de la cadena coincida con el formato especificado enTO_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 utilizaLPAD(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
DATEutilizando la funciónTO_DATE(), especificando el formato'DD-MM-YYYY'. - Finalmente, la variable
first_dayse muestra utilizandoDBMS_OUTPUT.PUT_LINE()después de formatearla conTO_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 tipoDATE.
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 deTO_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
DATEutilizando la funciónTO_DATE(), especificando el formato'DD-MM-YYYY'. - Finalmente, la variable
first_dayse muestra utilizandoDBMS_OUTPUT.PUT_LINE()después de formatearla conTO_CHAR().
Este método es una alternativa viable, aunque TRUNC() sigue siendo más directo.

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ística | TRUNC() | EXTRACT() | TO_CHAR() |
|---|---|---|---|
| Simplicidad del Código | Muy Alta (Una sola función) | Media (Múltiples extracciones y concatenación) | Media (Formateo y concatenación) |
| Rendimiento | Generalmente el más eficiente | Bueno (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) |
| Legibilidad | Excelente (Intuitivo) | Buena (Aunque más extenso) | Buena (Aunque más extenso) |
| Tipo de Retorno Intermedio | DATE | NUMBER (para EXTRACT), luego VARCHAR2 (para concatenación) | VARCHAR2 (para TO_CHAR) |
| Necesidad de TO_DATE() | No | Sí | Sí |
| Caso de Uso Principal | Obtener 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 ellos | Formatear 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. Sines 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 deSYSDATEsi el servidor y la sesión tienen zonas horarias distintas.SYSTIMESTAMPyCURRENT_TIMESTAMP: Similares aSYSDATEyCURRENT_DATE, pero retornan un tipo de datoTIMESTAMP 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 - 7te 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 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.
