En Oracle, el ROUND(date)
La función devuelve una fecha redondeada a una unidad de fecha específica.
De forma predeterminada, redondea la fecha al día más cercano, pero puede proporcionar un argumento opcional que especifique una unidad alternativa para usar.
Oracle también tiene un ROUND(number)
sintaxis, que se utiliza en el número. Este artículo es únicamente sobre el ROUND(date)
sintaxis, que se utiliza en date.
Sintaxis
La sintaxis es así:
ROUND(date [, fmt ])
Donde date
debe resolverse en DATE
valor, y fmt
es un modelo de formato opcional que especifica la unidad para redondear date
para. El modelo de formato puede ser cualquiera de los modelos de formato compatibles con TRUNC(date)
y ROUND(date)
funciones.
Ejemplo
He aquí un ejemplo:
SELECT
ROUND(TO_DATE('2030-12-31 12:30:45', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;
Resultado:
01-JAN-31
En este caso, la parte de la hora estaba pasada el mediodía y la fecha se redondeó al día siguiente (que también resultó ser el mes y el año siguientes).
Se redondeó al día porque esa es la unidad predeterminada para redondear y no especificamos explícitamente una unidad diferente.
Esto es lo que sucede cuando reduzco la porción de tiempo antes del mediodía:
SELECT
ROUND(TO_DATE('2030-12-31 11:59:59', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;
Resultado:
31-DEC-30
Esta vez se redondea al mismo día.
Tenga en cuenta que el formato de fecha devuelto depende del valor de su NLS_DATE_FORMAT
parámetro (aquí se explica cómo dar formato a los valores de fecha para su sesión si está interesado).
Redondear a una unidad de fecha especificada
Este es un ejemplo de cómo especificar una unidad de fecha diferente para redondear la fecha a:
SELECT
ROUND(DATE '2030-12-31', 'MONTH')
FROM DUAL;
Resultado:
01-JAN-31
Aquí está de nuevo, pero con varias otras fechas:
SELECT
ROUND(DATE '2030-03-10', 'MONTH') AS "2030-03-10",
ROUND(DATE '2030-03-18', 'MONTH') AS "2030-03-18",
ROUND(DATE '2030-08-10', 'MONTH') AS "2030-08-10",
ROUND(DATE '2030-08-10', 'MONTH') AS "2030-08-10"
FROM DUAL;
Resultado:
2030-03-10 2030-03-18 2030-08-10 2030-08-10 _____________ _____________ _____________ _____________ 01-MAR-30 01-APR-30 01-AUG-30 01-AUG-30
Y aquí está con la misma fecha, pero varios elementos de formato:
SELECT
ROUND(DATE '2030-10-31', 'DAY') AS "Day",
ROUND(DATE '2030-10-31', 'WW') AS "Week of year",
ROUND(DATE '2030-10-31', 'MONTH') AS "Month",
ROUND(DATE '2030-10-31', 'YEAR') AS "Year"
FROM DUAL;
Resultado:
Day Week of year Month Year ____________ _______________ ____________ ____________ 03-NOV-30 29-OCT-30 01-NOV-30 01-JAN-31
Esto demuestra cuánta variación podemos tener, dependiendo de la unidad de fecha especificada.
Fecha negativa
Esto es lo que sucede cuando las convertimos en fechas negativas:
SELECT
ROUND(DATE '-2030-10-31', 'DAY') AS "Day",
ROUND(DATE '-2030-10-31', 'WW') AS "Week of year",
ROUND(DATE '-2030-10-31', 'MONTH') AS "Month",
ROUND(DATE '-2030-10-31', 'YEAR') AS "Year"
FROM DUAL;
Resultado:
Day Week of year Month Year ____________ _______________ ____________ ____________ 28-OCT-30 29-OCT-30 01-NOV-30 01-JAN-29
Obviamente, los resultados cambiarán a medida que cambie la fecha.
Redondeo de argumentos sin fecha
Esto es lo que sucede cuando intentamos redondear un argumento sin fecha que no se puede convertir a DATE
tipo de datos:
SELECT ROUND('Bruce')
FROM DUAL;
Resultado:
Error starting at line : 1 in command - SELECT ROUND('Bruce') FROM DUAL Error report - ORA-01722: invalid number
Sin embargo, podemos redondear números; hay una versión numérica de esta función que nos permite redondear números.
Valores nulos
Intentando redondear null
devuelve null
y tratando de redondear una fecha por null
también da como resultado null
:
SET NULL 'null';
SELECT
ROUND(null),
ROUND(null, 'MONTH'),
ROUND(DATE '2030-12-20', null)
FROM DUAL;
Resultado:
ROUND(NULL) ROUND(NULL,'MONTH') ROUND(DATE'2030-12-20',NULL) ______________ ______________________ _______________________________ null null null
De forma predeterminada, SQLcl y SQL*Plus devuelven un espacio en blanco cada vez que null
ocurre como resultado de un SQL SELECT
declaración.
Sin embargo, puede usar SET NULL
para especificar una cadena diferente a devolver. Aquí especifiqué que la cadena null
debe ser devuelto.
Recuento de argumentos incorrecto
Llamando a ROUND()
sin pasar ningún argumento devuelve un error:
SELECT ROUND()
FROM DUAL;
Resultado:
Error starting at line : 1 in command - SELECT ROUND() FROM DUAL Error at Command Line : 1 Column : 8 Error report - SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function" *Cause: *Action:
Y pasar el número incorrecto de argumentos da como resultado un error:
SELECT ROUND(DATE '2030-12-20', 'day', 'month')
FROM DUAL;
Resultado:
Error starting at line : 1 in command - SELECT ROUND(DATE '2030-12-20', 'day', 'month') FROM DUAL Error at Command Line : 1 Column : 40 Error report - SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function" *Cause: *Action: