Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função ROUND(data) no Oracle


No Oracle, o ROUND(date) A função retorna uma data arredondada para uma unidade de data especificada.

Por padrão, ele arredonda a data para o dia mais próximo, mas você pode fornecer um argumento opcional que especifica uma unidade alternativa a ser usada.

Oracle também tem um ROUND(number) sintaxe, que é usada em number. Este artigo é apenas sobre o ROUND(date) sintaxe, que é usada na data.

Sintaxe


A sintaxe fica assim:
ROUND(date [, fmt ])

Onde date deve resolver para uma DATE valor e fmt é um modelo de formato opcional que especifica a unidade para arredondar date para. O modelo de formato pode ser qualquer um dos modelos de formato suportados para o TRUNC(date) e ROUND(date) funções.

Exemplo


Aqui está um exemplo:
SELECT 
    ROUND(TO_DATE('2030-12-31 12:30:45', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;

Resultado:
01-JAN-31

Nesse caso, a parte da hora passou do meio-dia e a data foi arredondada para o dia seguinte (que também passou a ser o próximo mês e ano).

Foi arredondado para o dia porque essa é a unidade padrão para arredondar e não especificamos explicitamente uma unidade diferente.

Veja o que acontece quando reduzo a parte do tempo para antes do meio-dia:
SELECT 
    ROUND(TO_DATE('2030-12-31 11:59:59', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;

Resultado:
31-DEC-30

Desta vez é arredondado para o mesmo dia.

Observe que o formato de data retornado depende do valor de seu NLS_DATE_FORMAT parâmetro (veja como formatar valores de data para sua sessão, se você estiver interessado).

Arredondar para uma unidade de data especificada


Aqui está um exemplo de especificação de uma unidade de data diferente para arredondar a data:
SELECT 
    ROUND(DATE '2030-12-31', 'MONTH')
FROM DUAL;

Resultado:
01-JAN-31

Aqui está novamente, mas com várias outras datas:
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    

E aqui está com a mesma data, mas vários 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    

Isso demonstra quanta variação podemos ter, dependendo da unidade de data especificada.

Data negativa


Aqui está o que acontece quando as transformamos em datas 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, os resultados mudarão conforme a data muda.

Argumentos de arredondamento sem data


Aqui está o que acontece quando tentamos arredondar um argumento sem data que não pode ser convertido em um DATE tipo de dados:
SELECT ROUND('Bruce')
FROM DUAL;

Resultado:
Error starting at line : 1 in command -
SELECT ROUND('Bruce')
FROM DUAL
Error report -
ORA-01722: invalid number

No entanto, podemos arredondar números – existe uma versão numérica dessa função que nos permite arredondar números.

Valores nulos


Tentando arredondar null retorna null , e tentando arredondar uma data por null também resulta em 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                            

Por padrão, SQLcl e SQL*Plus retornam um espaço em branco sempre que null ocorre como resultado de um SQL SELECT demonstração.

No entanto, você pode usar SET NULL para especificar uma string diferente a ser retornada. Aqui eu especifiquei que a string null deve ser devolvido.

Contagem incorreta de argumentos


Chamando ROUND() sem passar nenhum argumento retorna um erro:
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:

E passar o número errado de argumentos resulta em um erro:
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: