Oracle
 sql >> Base de données >  >> RDS >> Oracle

Fonction ROUND(date) dans Oracle

Dans Oracle, le ROUND(date) renvoie une date arrondie à une unité de date spécifiée.

Par défaut, il arrondit la date au jour le plus proche, mais vous pouvez fournir un argument facultatif qui spécifie une autre unité à utiliser.

Oracle a aussi un ROUND(number) syntaxe, qui est utilisée sur le nombre. Cet article concerne uniquement le ROUND(date) syntaxe, qui est utilisée sur date.

Syntaxe

La syntaxe ressemble à ceci :

ROUND(date [, fmt ])

date doit correspondre à une DATE valeur, et fmt est un modèle de format facultatif qui spécifie l'unité à arrondir date pour. Le modèle de format peut être l'un des modèles de format pris en charge pour le TRUNC(date) et ROUND(date) fonctions.

Exemple

Voici un exemple :

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

Résultat :

01-JAN-31

Dans ce cas, la partie heure était après midi et la date a été arrondie au jour suivant (qui s'est également avéré être le mois et l'année suivants).

Il a été arrondi au jour car c'est l'unité par défaut à laquelle arrondir, et nous n'avons pas explicitement spécifié une unité différente.

Voici ce qui se passe lorsque je réduis la portion horaire à avant midi :

SELECT 
    ROUND(TO_DATE('2030-12-31 11:59:59', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;

Résultat :

31-DEC-30

Cette fois, c'est arrondi au même jour.

Notez que le format de date renvoyé dépend de la valeur de votre NLS_DATE_FORMAT paramètre (voici comment formater les valeurs de date pour votre session si vous êtes intéressé).

Arrondir à une unité de date spécifiée

Voici un exemple de spécification d'une unité de date différente pour arrondir la date :

SELECT 
    ROUND(DATE '2030-12-31', 'MONTH')
FROM DUAL;

Résultat :

01-JAN-31

Le voici à nouveau, mais avec diverses autres dates :

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;

Résultat :

   2030-03-10    2030-03-18    2030-08-10    2030-08-10 
_____________ _____________ _____________ _____________ 
01-MAR-30     01-APR-30     01-AUG-30     01-AUG-30    

Et le voici avec la même date, mais différents éléments de format :

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;

Résultat :

         Day    Week of year        Month         Year 
____________ _______________ ____________ ____________ 
03-NOV-30    29-OCT-30       01-NOV-30    01-JAN-31    

Cela montre à quel point nous pouvons varier en fonction de l'unité de date spécifiée.

Date négative

Voici ce qui se passe lorsque nous les transformons en dates négatives :

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;

Résultat :

         Day    Week of year        Month         Year 
____________ _______________ ____________ ____________ 
28-OCT-30    29-OCT-30       01-NOV-30    01-JAN-29    

Évidemment, les résultats changeront à mesure que la date change.

Arrondir les arguments sans date

Voici ce qui se passe lorsque nous essayons d'arrondir un argument autre qu'une date qui ne peut pas être converti en DATE type de données :

SELECT ROUND('Bruce')
FROM DUAL;

Résultat :

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

Cependant, nous pouvons arrondir les nombres - il existe une version numérique de cette fonction qui nous permet d'arrondir les nombres.

Valeurs nulles

Essayer d'arrondir null renvoie null , et en essayant d'arrondir une date par null donne également null :

SET NULL 'null';

SELECT 
    ROUND(null),
    ROUND(null, 'MONTH'),    
    ROUND(DATE '2030-12-20', null)
FROM DUAL;

Résultat :

   ROUND(NULL)    ROUND(NULL,'MONTH')    ROUND(DATE'2030-12-20',NULL) 
______________ ______________________ _______________________________ 
          null                   null null                            

Par défaut, SQLcl et SQL*Plus renvoient un espace vide chaque fois que null se produit à la suite d'un SQL SELECT déclaration.

Cependant, vous pouvez utiliser SET NULL pour spécifier une autre chaîne à renvoyer. Ici, j'ai précisé que la chaîne null doit être retourné.

Nombre d'arguments incorrects

Appel de ROUND() sans passer d'argument renvoie une erreur :

SELECT ROUND()
FROM DUAL;

Résultat :

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:

Et passer le mauvais nombre d'arguments entraîne une erreur :

SELECT ROUND(DATE '2030-12-20', 'day', 'month')
FROM DUAL;

Résultat :

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: