sql >> Database >  >> RDS >> Oracle

RONDE(datum) Functie in Oracle

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:

  1. MySQL-opdrachtregelopmaak met UTF8

  2. Hoe RUNAS /NETONLY-functionaliteit in te bouwen in een (C#/.NET/WinForms) programma?

  3. Verkrijg id van een insert in dezelfde instructie

  4. UTF-8-tekens detecteren in een Latin1-gecodeerde kolom - MySQL