sql >> Base de Datos >  >> RDS >> Oracle

Función ROUND (fecha) en Oracle

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: