I Oracle, ROUND(date)
funktion returnerar ett datum avrundat till en angiven datumenhet.
Som standard avrundar det datumet till närmaste dag, men du kan ange ett valfritt argument som anger en alternativ enhet att använda.
Oracle har också en ROUND(number)
syntax, som används på tal. Den här artikeln handlar enbart om ROUND(date)
syntax, som används på datum.
Syntax
Syntaxen ser ut så här:
ROUND(date [, fmt ])
Där date
måste lösas till ett DATE
värde och fmt
är en valfri formatmodell som anger vilken enhet som ska rundas av date
till. Formatmodellen kan vara vilken som helst av de formatmodeller som stöds för TRUNC(date)
och ROUND(date)
funktioner.
Exempel
Här är ett exempel:
SELECT
ROUND(TO_DATE('2030-12-31 12:30:45', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;
Resultat:
01-JAN-31
I det här fallet var tidsdelen efter middagstid, och datumet avrundades till nästa dag (som också råkade vara nästa månad och år).
Den avrundades till dagen eftersom det är standardenheten att avrunda till, och vi har inte uttryckligen angett en annan enhet.
Så här händer när jag minskar tidsdelen till före middagstid:
SELECT
ROUND(TO_DATE('2030-12-31 11:59:59', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;
Resultat:
31-DEC-30
Den här gången avrundas det till samma dag.
Observera att datumformatet som returneras beror på värdet på din NLS_DATE_FORMAT
parameter (så här formaterar du datumvärden för din session om du är intresserad).
Avrunda till en specificerad datumenhet
Här är ett exempel på hur du anger en annan datumenhet att runda av datumet till:
SELECT
ROUND(DATE '2030-12-31', 'MONTH')
FROM DUAL;
Resultat:
01-JAN-31
Här är den igen, men med diverse andra datum:
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-30>Och här är den med samma datum, men olika formatelement:
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 Vecka i året Månad År ____________ _______________ ____________ ____________ 03-NOV-30 29-NOV-30 01-NOV-30 01-JAN-31Detta visar hur mycket variation vi kan ha, beroende på vilken datumenhet som anges.
Negativt datum
Så här händer när vi förvandlar dem till negativa datum:
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 Vecka i året Månad År ____________ _______________ ____________ ____________ 28-OKT-30 29-OKT-30 01-NOV-30 01-JAN-29Uppenbarligen kommer resultaten att ändras när datumet ändras.
Avrundning av icke-datumargument
Här är vad som händer när vi försöker runda ett argument som inte är datum som inte kan konverteras till ett
DATE
datatyp:SELECT ROUND('Bruce') FROM DUAL;
Resultat:
Fel som börjar på rad:1 i kommandot -SELECT ROUND('Bruce')FRÅN DUALFelrapport -ORA-01722:ogiltigt nummerMen vi kan avrunda siffror – det finns en numerisk version av den här funktionen som låter oss avrunda siffror.
Nullvärden
Försöker runda
null
returnerarnull
, och försöker avrunda ett datum mednull
resulterar också 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 returnerar SQLcl och SQL*Plus ett tomt utrymme när
null
uppstår som ett resultat av en SQLSELECT
påstående.Du kan dock använda
SET NULL
för att ange en annan sträng som ska returneras. Här specificerade jag att strängennull
bör returneras.Inkorrekt antal argument
Anropar
ROUND()
utan att skicka några argument returnerar ett fel:SELECT ROUND() FROM DUAL;
Resultat:
Fel som börjar på rad :1 i kommandot -SELECT ROUND()FROM DUALError på kommandoraden :1 Kolumn :8Felrapport -SQL-fel:ORA-00938:inte tillräckligt med argument för funktion00938. 00000 - "inte tillräckligt med argument för funktion"*Orsak:*Åtgärd:Och att skicka fel antal argument resulterar i ett fel:
SELECT ROUND(DATE '2030-12-20', 'day', 'month') FROM DUAL;
Resultat:
Fel som börjar på rad:1 i kommandot -SELECT ROUND(DATE '2030-12-20', 'day', 'month')FROM DUALError på kommandoraden:1 kolumn:40Felrapport -SQL-fel:ORA-00939 :för många argument för funktion00939. 00000 - "för många argument för funktion"*Orsak:*Åtgärd: