In Oracle is de ROUND(date)
functie retourneert een datum afgerond op een opgegeven datumeenheid.
Standaard rondt het de datum af op de dichtstbijzijnde dag, maar u kunt een optioneel argument opgeven dat een alternatieve eenheid specificeert om te gebruiken.
Oracle heeft ook een ROUND(number)
syntaxis, die wordt gebruikt op nummer. Dit artikel gaat uitsluitend over de ROUND(date)
syntaxis, die op datum wordt gebruikt.
Syntaxis
De syntaxis gaat als volgt:
ROUND(date [, fmt ])
Waar date
moet oplossen op een DATE
waarde, en fmt
is een optioneel formaatmodel dat de eenheid specificeert om date
. af te ronden tot. Het formaatmodel kan elk van de ondersteunde formaatmodellen zijn voor de TRUNC(date)
en ROUND(date)
functies.
Voorbeeld
Hier is een voorbeeld:
SELECT
ROUND(TO_DATE('2030-12-31 12:30:45', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;
Resultaat:
01-JAN-31
In dit geval was het tijdsdeel na het middaguur en werd de datum afgerond op de volgende dag (wat toevallig ook de volgende maand en het volgende jaar was).
Het werd afgerond op de dag omdat dat de standaardeenheid is om naar af te ronden, en we hebben niet expliciet een andere eenheid gespecificeerd.
Dit is wat er gebeurt als ik het tijdsdeel verminder tot vóór de middag:
SELECT
ROUND(TO_DATE('2030-12-31 11:59:59', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;
Resultaat:
31-DEC-30
Deze keer is het afgerond op dezelfde dag.
Merk op dat het geretourneerde datumformaat afhangt van de waarde van uw NLS_DATE_FORMAT
parameter (hier leest u hoe u datumwaarden voor uw sessie kunt opmaken als u hierin geïnteresseerd bent).
Afronden op een gespecificeerde datumeenheid
Hier is een voorbeeld van het specificeren van een andere datumeenheid om de datum op af te ronden:
SELECT
ROUND(DATE '2030-12-31', 'MONTH')
FROM DUAL;
Resultaat:
01-JAN-31
Hier is hij weer, maar met verschillende andere data:
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;
Resultaat:
2030-03-10 2030-03-18 2030-08-10 2030-08-10 _____________ _____________ _____________ _____________ 01-MAR-30 01-APR-30 01-AUG-30 01-AUG-30
En hier is het met dezelfde datum, maar met verschillende formaatelementen:
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;
Resultaat:
Day Week of year Month Year ____________ _______________ ____________ ____________ 03-NOV-30 29-OCT-30 01-NOV-30 01-JAN-31
Dit laat zien hoeveel variatie we kunnen hebben, afhankelijk van de gespecificeerde datumeenheid.
Negatieve datum
Dit gebeurt er als we ze omzetten in negatieve datums:
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;
Resultaat:
Day Week of year Month Year ____________ _______________ ____________ ____________ 28-OCT-30 29-OCT-30 01-NOV-30 01-JAN-29
Het is duidelijk dat de resultaten veranderen als de datum verandert.
Afronding van niet-datumargumenten
Dit is wat er gebeurt als we een niet-datumargument proberen af te ronden dat niet kan worden geconverteerd naar een DATE
gegevenstype:
SELECT ROUND('Bruce')
FROM DUAL;
Resultaat:
Error starting at line : 1 in command - SELECT ROUND('Bruce') FROM DUAL Error report - ORA-01722: invalid number
We kunnen echter getallen afronden - er is een numerieke versie van deze functie waarmee we getallen kunnen afronden.
Null-waarden
Probeert null
af te ronden retourneert null
en proberen een datum af te ronden met null
resulteert ook in null
:
SET NULL 'null';
SELECT
ROUND(null),
ROUND(null, 'MONTH'),
ROUND(DATE '2030-12-20', null)
FROM DUAL;
Resultaat:
ROUND(NULL) ROUND(NULL,'MONTH') ROUND(DATE'2030-12-20',NULL) ______________ ______________________ _______________________________ null null null
Standaard retourneren SQLcl en SQL*Plus een spatie wanneer null
treedt op als resultaat van een SQL SELECT
uitspraak.
U kunt echter SET NULL
. gebruiken om een andere tekenreeks op te geven die moet worden geretourneerd. Hier heb ik gespecificeerd dat de string null
moet worden geretourneerd.
Onjuist aantal argumenten
ROUND()
. aanroepen zonder het doorgeven van argumenten geeft een fout:
SELECT ROUND()
FROM DUAL;
Resultaat:
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:
En het doorgeven van het verkeerde aantal argumenten resulteert in een fout:
SELECT ROUND(DATE '2030-12-20', 'day', 'month')
FROM DUAL;
Resultaat:
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: