I Oracle er ROUND(date)
funktion returnerer en dato afrundet til en specificeret datoenhed.
Som standard afrundes datoen til nærmeste dag, men du kan angive et valgfrit argument, der angiver en alternativ enhed, der skal bruges.
Oracle har også en ROUND(number)
syntaks, som bruges på tal. Denne artikel handler udelukkende om ROUND(date)
syntaks, som bruges på dato.
Syntaks
Syntaksen ser sådan ud:
ROUND(date [, fmt ])
Hvor date
skal løses til en DATE
værdi og fmt
er en valgfri formatmodel, der specificerer den enhed, der skal rundes date
til. Formatmodellen kan være en hvilken som helst af de understøttede formatmodeller for TRUNC(date)
og ROUND(date)
funktioner.
Eksempel
Her er et eksempel:
SELECT
ROUND(TO_DATE('2030-12-31 12:30:45', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;
Resultat:
01-JAN-31
I dette tilfælde var tidsdelen over middag, og datoen blev afrundet til næste dag (som også tilfældigvis var den næste måned og år).
Det blev afrundet til dagen, fordi det er standardenheden at runde af til, og vi har ikke eksplicit specificeret en anden enhed.
Her er, hvad der sker, når jeg reducerer tidsdelen til før middag:
SELECT
ROUND(TO_DATE('2030-12-31 11:59:59', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;
Resultat:
31-DEC-30
Denne gang er det afrundet til samme dag.
Bemærk, at datoformatet, der returneres, afhænger af værdien af din NLS_DATE_FORMAT
parameter (her er, hvordan du formaterer datoværdier for din session, hvis du er interesseret).
Afrund til en specificeret datoenhed
Her er et eksempel på at angive en anden datoenhed, som datoen skal rundes af til:
SELECT
ROUND(DATE '2030-12-31', 'MONTH')
FROM DUAL;
Resultat:
01-JAN-31
Her er den igen, men med forskellige andre datoer:
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;
Resultat:
2030-03-10 2030-03-18 2030-08-10 2030-08-10 _____________ _____________ _____________ _____________ 01-MAR-30 01-APR-30 01-AUG-30-30-AUG-30>Og her er den med samme dato, men forskellige formatelementer:
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;
Resultat:
Dag Uge i året Måned År ____________ _______________ ____________ ____________ 03-NOV-30 29-OCT-30 01-NOV-30 01-JAN-31Dette viser, hvor meget variation vi kan have, afhængigt af den angivne datoenhed.
Negativ dato
Her er, hvad der sker, når vi forvandler dem til negative datoer:
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;
Resultat:
Dag Uge i året Måned År ____________ _______________ ____________ ____________ 28-OCT-30 29-OCT-30 01-NOV-30 01-JAN-29Naturligvis vil resultaterne ændre sig, efterhånden som datoen ændres.
Afrunding af ikke-dato-argumenter
Her er, hvad der sker, når vi forsøger at runde et ikke-dato-argument, der ikke kan konverteres til en
DATE
datatype:SELECT ROUND('Bruce') FROM DUAL;
Resultat:
Fejl starter ved linje:1 i kommando -SELECT ROUND('Bruce')FROM DUALFejlrapport -ORA-01722:ugyldigt nummerVi kan dog afrunde tal – der er en numerisk version af denne funktion, der giver os mulighed for at afrunde tal.
Nul-værdier
Forsøger at runde
null
returnerernull
, og forsøger at runde en dato mednull
resulterer også inull
:SET NULL 'null'; SELECT ROUND(null), ROUND(null, 'MONTH'), ROUND(DATE '2030-12-20', null) FROM DUAL;
Resultat:
ROUND(NULL) ROUND(NULL,'MONTH') ROUND(DATE'2030-12-20',NULL) ______________ ________________________________ _______________________________ null null nullSom standard returnerer SQLcl og SQL*Plus et tomt mellemrum, når
null
opstår som et resultat af en SQLSELECT
udmelding.Du kan dog bruge
SET NULL
for at angive en anden streng, der skal returneres. Her specificerede jeg, at strengennull
skal returneres.Forkert antal argumenter
Kalder
ROUND()
uden at sende nogen argumenter returnerer en fejl:SELECT ROUND() FROM DUAL;
Resultat:
Fejl starter på linje :1 i kommando -SELECT ROUND()FROM DUALE Fejl ved kommandolinje :1 Kolonne :8Fejlrapport -SQL-fejl:ORA-00938:ikke nok argumenter til funktion00938. 00000 - "ikke nok argumenter for funktion"*Årsag:*Handling:Og at sende det forkerte antal argumenter resulterer i en fejl:
SELECT ROUND(DATE '2030-12-20', 'day', 'month') FROM DUAL;
Resultat:
Fejl starter på linje:1 i kommando -SELECT ROUND(DATE '2030-12-20', 'day', 'month')FROM DUALEfejl på kommandolinje:1 Kolonne:40Fejlrapport -SQL-fejl:ORA-00939 :for mange argumenter til funktion00939. 00000 - "for mange argumenter for funktion"*Årsag:*Handling: