添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
ROUND

ROUND

函数 ROUND 根据指定的模板模式返回一个经过取整的日期类型值。

如果没有指定模板模式,且参数类型为 date 或者 timstamp 等日期类型,那么就将日期取整到最近的一天;如果参数类型为 interval 类型,那么就把时间月份数和天数取出,按照每个月 30 天计算,然后相加返回天数。

下表展示了函数 ROUND 所使用的模板模式。

表 1. ROUND 函数日期模板

模式

说明

CC, SCC

返回 CC01 1 1 日,如果 CC 后的两位数字小于等于 50,则 CC 是给定年份的前两位数字;如果 CC 后的两位数字大于 50,则 CC 是给定年份的两位数字加 1。

SYYY, YYYY, YEAR, SYEAR, YYY, YY, Y

返回 YYYY 1 1 日,6 30 日及以前返回指定年份的 1 1 日;7 1 日以后返回次年的 1 1 日。

IYYY, IYY, IY, I

返回 ISO 年份的开始日期,如果日期是 6 30 号及以前,则返回当前 ISO 年份的开始日期;如果日期是 7 1 号以后,则返回下个 ISO 年份的开始日期。

说明

ISO 年份是以 7 天为跨度从第一个星期一开始,从星期一到星期日,包含新的一年里至少 4 天的日期。因此,可以从前一年的 12 月开始一个 ISO 年份。

Q

返回季度的第一天。如果日期为该季度第二个月的 15 号及以前,则返回当前季度的第一天;如果日期为该季度的第二个月的 16 号以后,则返回下个季度的第一天。

MONTH, MON, MM, RM

返回月份的第一天。如果日期为 15 号及以前,则返回当前月的第一天;如果日期为 16 号以后,则返回次月的第一天。

WW

返回与当前日期最近的星期。

IW

把日期取整与之到最近的以 ISO 格式表示的星期数。

W

日期值取整到与之最接近的一周,其中周的开始日期被认为是和每月第一天相同。

DDD, DD, J

日期值取整到与之最接近的一天。

DAY, DY, D

日期值取整到与之最接近星期天。

HH, HH12, HH24

日期值取整到与之最接近的小时值。

MI

日期值取整到与之最接近的分钟值。

下面是函数 ROUND 的使用示例。

下面的示例将日期取整到与之最接近的世纪的开始年份。

SELECT TO_CHAR(ROUND(TO_DATE('1950','YYYY'),'CC'),'DD-MON-YYYY') "Century" FROM DUAL;
   Century
-------------
 01-JAN-1901
(1 row)
SELECT TO_CHAR(ROUND(TO_DATE('1951','YYYY'),'CC'),'DD-MON-YYYY') "Century" FROM DUAL;
   Century
-------------
 01-JAN-2001
(1 row)    

下面的示例将日期取整到与之最近年份的开始日期。

SELECT TO_CHAR(ROUND(TO_DATE('30-JUN-1999','DD-MON-YYYY'),'Y'),'DD-MON-YYYY') "Year" FROM DUAL;
-------------
 01-JAN-1999
(1 row)
SELECT TO_CHAR(ROUND(TO_DATE('01-JUL-1999','DD-MON-YYYY'),'Y'),'DD-MON-YYYY') "Year" FROM DUAL;
-------------
 01-JAN-2000
(1 row)    

下面的示例将日期取整到与之最接近 ISO 年份的开始日期。第一个示例把日期取整为 2004 年,对于 2004 年的 ISO 年份来说,实际上是在 2003 12 29 号开始。第二个示例把日期取整到 2005 年。对于 2005 年的 ISO 年份来说,实际上是在 2005 年的 1 3 号开始。

说明

ISO 年份是以 7 天为跨度从第一个星期一开始,从星期一到星期日,包含新的一年里至少 4 天的日期。因此,可以从前一年的 12 月开始一个 ISO 年份。

SELECT TO_CHAR(ROUND(TO_DATE('30-JUN-2004','DD-MON-YYYY'),'IYYY'),'DD-MON-YYYY') "ISO Year" FROM DUAL;
  ISO Year
-------------
 29-DEC-2003
(1 row)
SELECT TO_CHAR(ROUND(TO_DATE('01-JUL-2004','DD-MON-YYYY'),'IYYY'),'DD-MON-YYYY') "ISO Year" FROM DUAL;
  ISO Year
-------------
 03-JAN-2005
(1 row)    

下面的示例把日期取整到与之最接近的季度。

SELECT ROUND(TO_DATE('15-FEB-07','DD-MON-YY'),'Q') "Quarter" FROM DUAL;
      Quarter
--------------------
 01-JAN-07 00:00:00
(1 row)
SELECT ROUND(TO_DATE('16-FEB-07','DD-MON-YY'),'Q') "Quarter" FROM DUAL;
      Quarter
--------------------
 01-APR-07 00:00:00
(1 row)    

下面的示例将日期取整与之到最近的月份。

SELECT ROUND(TO_DATE('15-DEC-07','DD-MON-YY'),'MONTH') "Month" FROM DUAL;
       Month
--------------------
 01-DEC-07 00:00:00
(1 row)
SELECT ROUND(TO_DATE('16-DEC-07','DD-MON-YY'),'MONTH') "Month" FROM DUAL;
       Month
--------------------
 01-JAN-08 00:00:00
(1 row)

下面的示例将日期取整与之最接近的星期。所以在第一个示例中,与 2007 1 18 日最接近的星期一是 2007 1 15 日。在第二个示例中,与 2007 1 19 日最接近的星期一是 2007 1 22 日。

SELECT ROUND(TO_DATE('18-JAN-07','DD-MON-YY'),'WW') "Week" FROM DUAL;
--------------------
 15-JAN-07 00:00:00
(1 row)
SELECT ROUND(TO_DATE('19-JAN-07','DD-MON-YY'),'WW') "Week" FROM DUAL;
--------------------
 22-JAN-07 00:00:00
(1 row)    

下面的示例把日期取整与之到最近的以 ISO 格式表示的星期数。以 ISO 格式表示的周数从星期一开始,在第一个示例中,与日期 2004 1 1 日是最接近的星期一是 2003 12 29 日。在第二个示例中,与 2004 1 2 日最接近的星期一是 2004 1 5 日。

SELECT ROUND(TO_DATE('01-JAN-04','DD-MON-YY'),'IW') "ISO Week" FROM DUAL;
      ISO Week
--------------------
 29-DEC-03 00:00:00
(1 row)
SELECT ROUND(TO_DATE('02-JAN-04','DD-MON-YY'),'IW') "ISO Week" FROM DUAL;
      ISO Week
--------------------
 05-JAN-04 00:00:00
(1 row)        

下面的示例把日期值取整到与之最接近的一周,其中周的开始日期被认为是和每月第一天相同。

SELECT ROUND(TO_DATE('05-MAR-07','DD-MON-YY'),'W') "Week" FROM DUAL;
--------------------
 08-MAR-07 00:00:00
(1 row)
SELECT ROUND(TO_DATE('04-MAR-07','DD-MON-YY'),'W') "Week" FROM DUAL;
--------------------
 01-MAR-07 00:00:00
(1 row)    

下面的示例把日期值取整到与之最接近的日期。

SELECT ROUND(TO_DATE('04-AUG-07 11:59:59 AM','DD-MON-YY HH:MI:SS AM'),'J') "Day" FROM DUAL;
--------------------
 04-AUG-07 00:00:00
(1 row)
SELECT ROUND(TO_DATE('04-AUG-07 12:00:00 PM','DD-MON-YY HH:MI:SS AM'),'J') "Day" FROM DUAL;
--------------------
 05-AUG-07 00:00:00
(1 row)

下面的示例把日期值取整到与之最接近,周日期为星期天的日期。

SELECT ROUND(TO_DATE('08-AUG-07','DD-MON-YY'),'DAY') "Day of Week" FROM DUAL;
    Day of Week
--------------------
 05-AUG-07 00:00:00
(1 row)
SELECT ROUND(TO_DATE('09-AUG-07','DD-MON-YY'),'DAY') "Day of Week" FROM DUAL;
    Day of Week
--------------------
 12-AUG-07 00:00:00
(1 row)

下面的示例把日期值取整到与之最接近的小时值。

SELECT TO_CHAR(ROUND(TO_DATE('09-AUG-07 08:29','DD-MON-YY HH:MI'),'HH'),'DD-MON-YY HH24:MI:SS') "Hour" FROM DUAL;
--------------------
 09-AUG-07 08:00:00
(1 row)
SELECT TO_CHAR(ROUND(TO_DATE('09-AUG-07 08:30','DD-MON-YY HH:MI'),'HH'),'DD-MON-YY HH24:MI:SS') "Hour" FROM DUAL;
--------------------
 09-AUG-07 09:00:00
(1 row)

下面的示例把日期值取整到与之最接近的分钟值。

SELECT TO_CHAR(ROUND(TO_DATE('09-AUG-07 08:30:29','DD-MON-YY HH:MI:SS'),'MI'),'DD-MON-YY HH24:MI:SS') "Minute" FROM DUAL;
       Minute
--------------------
 09-AUG-07 08:30:00
(1 row)
SELECT TO_CHAR(ROUND(TO_DATE('09-AUG-07 08:30:30','DD-MON-YY HH:MI:SS'),'MI'),'DD-MON-YY HH24:MI:SS') "Minute" FROM DUAL;
       Minute
--------------------
 09-AUG-07 08:31:00
(1 row)

下面的示例将时间间隔类型取整。

SELECT ROUND(TIMESTAMP '2020-10-10 10:22:22' - TIMESTAMP '2020-10-05 12:22:22');
 round 
-------
(1 row)
SELECT ROUND(INTERVAL '1 year 13 months 3 days');
 round 
-------
(1 row)