Oracle
 sql >> база данни >  >> RDS >> Oracle

Функция ROUND(дата) в Oracle

В Oracle ROUND(date) функцията връща дата, закръглена до определена единица за дата.

По подразбиране закръглява датата до най-близкия ден, но можете да предоставите незадължителен аргумент, който посочва алтернативна единица за използване.

Oracle също има ROUND(number) синтаксис, който се използва за число. Тази статия е само за ROUND(date) синтаксис, който се използва на дата.

Синтаксис

Синтаксисът е така:

ROUND(date [, fmt ])

Където date трябва да се разреши до DATE стойност и fmt е допълнителен модел на формат, който определя единицата за закръгляване на date да се. Моделът на формата може да бъде всеки от поддържаните модели на формат за TRUNC(date) и ROUND(date) функции.

Пример

Ето един пример:

SELECT 
    ROUND(TO_DATE('2030-12-31 12:30:45', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;

Резултат:

01-JAN-31

В този случай частта от времето беше след обяд и датата беше закръглена до следващия ден (който също беше следващият месец и година).

Тя беше закръглена до деня, защото това е единицата по подразбиране, до която трябва да се закръгли, и не сме посочили изрично различна единица.

Ето какво се случва, когато намаля времевата част до преди обяд:

SELECT 
    ROUND(TO_DATE('2030-12-31 11:59:59', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;

Резултат:

31-DEC-30

Този път се закръгля до същия ден.

Имайте предвид, че върнатият формат на датата зависи от стойността на вашия NLS_DATE_FORMAT параметър (ето как да форматирате стойности за дата за вашата сесия, ако се интересувате).

Закръгляване до определена единица за дата

Ето пример за посочване на различна единица за дата, за да закръглите датата до:

SELECT 
    ROUND(DATE '2030-12-31', 'MONTH')
FROM DUAL;

Резултат:

01-JAN-31

Ето го отново, но с различни други дати:

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;

Резултат:

   2030-03-10    2030-03-18    2030-08-10    2030-08-10 
_____________ _____________ _____________ _____________ 
01-MAR-30     01-APR-30     01-AUG-30     01-AUG-30    

И ето го със същата дата, но различни форматни елементи:

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;

Резултат:

         Day    Week of year        Month         Year 
____________ _______________ ____________ ____________ 
03-NOV-30    29-OCT-30       01-NOV-30    01-JAN-31    

Това показва колко вариации можем да имаме в зависимост от посочената единица за дата.

Отрицателна дата

Ето какво се случва, когато ги превърнем в отрицателни дати:

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;

Резултат:

         Day    Week of year        Month         Year 
____________ _______________ ____________ ____________ 
28-OCT-30    29-OCT-30       01-NOV-30    01-JAN-29    

Очевидно резултатите ще се променят с промяната на датата.

Закръгляване на аргументи без дата

Ето какво се случва, когато се опитаме да закръглим аргумент без дата, който не може да бъде преобразуван в DATE тип данни:

SELECT ROUND('Bruce')
FROM DUAL;

Резултат:

Error starting at line : 1 in command -
SELECT ROUND('Bruce')
FROM DUAL
Error report -
ORA-01722: invalid number

Въпреки това можем да закръгляваме числата – има цифрова версия на тази функция, която ни позволява да закръгляваме числа.

Нулеви стойности

Опитвам се да закръгля null връща null и се опитва да закръгли дата с null също води до null :

SET NULL 'null';

SELECT 
    ROUND(null),
    ROUND(null, 'MONTH'),    
    ROUND(DATE '2030-12-20', null)
FROM DUAL;

Резултат:

   ROUND(NULL)    ROUND(NULL,'MONTH')    ROUND(DATE'2030-12-20',NULL) 
______________ ______________________ _______________________________ 
          null                   null null                            

По подразбиране SQLcl и SQL*Plus връщат празно пространство всеки път, когато null възниква в резултат на SQL SELECT изявление.

Можете обаче да използвате SET NULL за да посочите различен низ, който да бъде върнат. Тук посочих, че низът null трябва да бъдат върнати.

Неправилен брой аргументи

Извикване на ROUND() без подаване на аргументи връща грешка:

SELECT ROUND()
FROM DUAL;

Резултат:

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:

И предаването на грешен брой аргументи води до грешка:

SELECT ROUND(DATE '2030-12-20', 'day', 'month')
FROM DUAL;

Резултат:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. COUNT(rowid) по-бърз ли е от COUNT(*)?

  2. как да изградите отново опашката wf_java_deferred

  3. Намиране на редове, които не съдържат числови данни в Oracle

  4. как да вмъкна текуща дата в поле ДАТА във формат dd/mm/yyyy в oracle

  5. Какво представляват PL/SQL съхранените процедури в базата данни на Oracle