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: