In Oracle, il ROUND(date)
la funzione restituisce una data arrotondata a un'unità di data specificata.
Per impostazione predefinita, arrotonda la data al giorno più vicino, ma puoi fornire un argomento facoltativo che specifica un'unità alternativa da utilizzare.
Oracle ha anche un ROUND(number)
sintassi, che è usata sul numero. Questo articolo riguarda esclusivamente il ROUND(date)
sintassi, che è usata su date.
Sintassi
La sintassi è questa:
ROUND(date [, fmt ])
Dove date
deve risolversi in un DATE
valore e fmt
è un modello di formato opzionale che specifica l'unità di misura per arrotondare la date
a. Il modello di formato può essere uno qualsiasi dei modelli di formato supportati per TRUNC(date)
e ROUND(date)
funzioni.
Esempio
Ecco un esempio:
SELECT
ROUND(TO_DATE('2030-12-31 12:30:45', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;
Risultato:
01-JAN-31
In questo caso, la parte dell'ora era passata il mezzogiorno e la data è stata arrotondata al giorno successivo (che era anche il mese e l'anno successivi).
È stato arrotondato al giorno perché è l'unità predefinita a cui arrotondare e non abbiamo specificato esplicitamente un'unità diversa.
Ecco cosa succede quando riduco la fascia oraria prima di mezzogiorno:
SELECT
ROUND(TO_DATE('2030-12-31 11:59:59', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;
Risultato:
31-DEC-30
Questa volta viene arrotondato allo stesso giorno.
Tieni presente che il formato della data restituito dipende dal valore del tuo NLS_DATE_FORMAT
parametro (ecco come formattare i valori di data per la tua sessione se sei interessato).
Arrotonda a un'unità di data specificata
Ecco un esempio di specifica di un'unità di data diversa per arrotondare la data a:
SELECT
ROUND(DATE '2030-12-31', 'MONTH')
FROM DUAL;
Risultato:
01-JAN-31
Eccolo di nuovo, ma con varie altre date:
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;
Risultato:
2030-03-10 2030-03-18 2030-08-10 2030-08-10 _____________ _____________ _____________ _____________ 01-MAR-30 01-APR-30 01-AUG-30 01-AUG-30
Ed eccolo qui con la stessa data, ma vari elementi di 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;
Risultato:
Day Week of year Month Year ____________ _______________ ____________ ____________ 03-NOV-30 29-OCT-30 01-NOV-30 01-JAN-31
Questo dimostra quanta variazione possiamo avere, a seconda dell'unità di data specificata.
Data negativa
Ecco cosa succede quando le trasformiamo in date negative:
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;
Risultato:
Day Week of year Month Year ____________ _______________ ____________ ____________ 28-OCT-30 29-OCT-30 01-NOV-30 01-JAN-29
Ovviamente, i risultati cambieranno al variare della data.
Arrotondamento degli argomenti senza data
Ecco cosa succede quando proviamo ad arrotondare un argomento non di data che non può essere convertito in un DATE
tipo di dati:
SELECT ROUND('Bruce')
FROM DUAL;
Risultato:
Error starting at line : 1 in command - SELECT ROUND('Bruce') FROM DUAL Error report - ORA-01722: invalid number
Tuttavia, possiamo arrotondare i numeri:esiste una versione numerica di questa funzione che ci consente di arrotondare i numeri.
Valori Nulli
Tentativo di arrotondare null
restituisce null
e provando ad arrotondare una data per null
risulta anche null
:
SET NULL 'null';
SELECT
ROUND(null),
ROUND(null, 'MONTH'),
ROUND(DATE '2030-12-20', null)
FROM DUAL;
Risultato:
ROUND(NULL) ROUND(NULL,'MONTH') ROUND(DATE'2030-12-20',NULL) ______________ ______________________ _______________________________ null null null
Per impostazione predefinita, SQLcl e SQL*Plus restituiscono uno spazio vuoto ogni volta che null
si verifica come risultato di un SQL SELECT
dichiarazione.
Tuttavia, puoi utilizzare SET NULL
per specificare una stringa diversa da restituire. Qui ho specificato che la stringa null
deve essere restituito.
Conteggio argomenti errato
Chiamando ROUND()
senza passare alcun argomento restituisce un errore:
SELECT ROUND()
FROM DUAL;
Risultato:
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 il passaggio del numero errato di argomenti genera un errore:
SELECT ROUND(DATE '2030-12-20', 'day', 'month')
FROM DUAL;
Risultato:
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: