В 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: