sql >> Databasteknik >  >> RDS >> Oracle

ROUND(datum) Funktion i Oracle

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-31 

Detta 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-29 

Uppenbarligen 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 nummer

Men 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 returnerar null , och försöker avrunda ett datum med null resulterar också i null :

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 null 

Som standard returnerar SQLcl och SQL*Plus ett tomt utrymme när null uppstår som ett resultat av en SQL SELECT 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ängen null 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:

  1. Måste jag skydda mig mot SQL-injektion om jag använde en rullgardinsmeny?

  2. Hur man konverterar en Unix-tidsstämpel till ett datum-/tidsvärde i PostgreSQL

  3. Hur man uppdaterar Oracle Clob med JDBC

  4. 3 sätt att skapa ett CREATE TABLE-skript från en befintlig tabell i SQLite