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 ])
Où 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: