Oracle
 sql >> Database >  >> RDS >> Oracle

ROUND(data) Funzione in Oracle

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: