函数TRUNC返回一个根据指定模板模式截断的日期类型值。

如果没有使用模板模式,那么就把日期截断到离它最近的一天。下面的表格显示了函数TRUNC所允许使用的模板模式。

表 1. Template Date Patterns for the TRUNC Function
Pattern Description
CC, SCC Returns January 1, cc01 where cc is first 2 digits of the given year
SYYY, YYYY, YEAR, SYEAR, YYY, YY, Y Returns January 1, yyyy where yyyy is the given year
IYYY, IYY, IY, I Returns the start date of the ISO year containing the given date
Q Returns the first day of the quarter containing the given date
MONTH, MON, MM, RM Returns the first day of the specified month
WW Returns the largest date just prior to, or the same as the given date that corresponds to the same day of the week as the first day of the year
IW Returns the start of the ISO week containing the given date
W Returns the largest date just prior to, or the same as the given date that corresponds to the same day of the week as the first day of the month
DDD, DD, J Returns the start of the day for the given date
DAY, DY, D Returns the start of the week (Sunday) containing the given date
HH, HH12, HH2 4 Returns the start of the hour
MI Returns the start of the minute

TRUNC函数示例

下面的示例把日期向前截断为日期所在世纪的开始日期。

SELECT TO_CHAR(TRUNC(TO_DATE('1951','YYYY'),'CC'),'DD-MON-YYYY') "Century" FROM DUAL;

   Century
-------------
 01-JAN-1901
(1 row)    

下面的示例把日期截断到日期中年份的开始日期。

SELECT TO_CHAR(TRUNC(TO_DATE('01-JUL-1999','DD-MON-YYYY'),'Y'),'DD-MON-YYYY') "Year" FROM DUAL;

    Year
-------------
 01-JAN-1999
(1 row)

下面的示例把日期截断到ISO年份的开始日期。

SELECT TO_CHAR(TRUNC(TO_DATE('01-JUL-2004','DD-MON-YYYY'),'IYYY'),'DD-MON-YYYY') "ISO Year" FROM DUAL;

  ISO Year
-------------
 29-DEC-2003
(1 row)        

下面的示例把日期截断到当前日期所在季度的开始日期。

SELECT TRUNC(TO_DATE('16-FEB-07','DD-MON-YY'),'Q') "Quarter" FROM DUAL;

      Quarter
--------------------
 01-JAN-07 00:00:00
(1 row)    

下面的示例把日期截断到一个月的开始日期。

SELECT TRUNC(TO_DATE('16-DEC-07','DD-MON-YY'),'MONTH') "Month" FROM DUAL;

       Month
--------------------
 01-DEC-07 00:00:00
(1 row)

下面的示例把日期截断到日期所在周的开始日期,周的开始日期是由一年中第一天的周日期决定的。例如:2007年的第一天是周一,所以在1月19日前面的周一的日期是1月15号。

SELECT TRUNC(TO_DATE('19-JAN-07','DD-MON-YY'),'WW') "Week" FROM DUAL;

        Week
--------------------
 15-JAN-07 00:00:00
(1 row)

下面的示例将日期截断到一个ISO周的开始。一个ISO周在星期一开始,落在ISO周的日期是2004年1月2号,那么这个ISO周从2003年12月29日开始。

SELECT TRUNC(TO_DATE('02-JAN-04','DD-MON-YY'),'IW') "ISO Week" FROM DUAL;

      ISO Week
--------------------
 29-DEC-03 00:00:00
(1 row)

下面的示例把日期截断到一周的开始日期,周的开始日期被认为和一个月的第一天相同。

SELECT TRUNC(TO_DATE('21-MAR-07','DD-MON-YY'),'W') "Week" FROM DUAL;

        Week
--------------------
 15-MAR-07 00:00:00
(1 row)

下面的示例把日期截断到一天的开始时间。

SELECT TRUNC(TO_DATE('04-AUG-07 12:00:00 PM','DD-MON-YY HH:MI:SS AM'),'J') "Day" FROM DUAL;

        Day
--------------------
 04-AUG-07 00:00:00
(1 row)

下面的示例把日期截断到一周的开始日期(周日)。

SELECT TRUNC(TO_DATE('09-AUG-07','DD-MON-YY'),'DAY') "Day of Week" FROM DUAL;

    Day of Week
--------------------
 05-AUG-07 00:00:00
(1 row)

下面的示例把日期截断到小时。

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

        Hour
--------------------
 09-AUG-07 08:00:00
(1 row)

下面的示例把日期截断到分钟。

SELECT TO_CHAR(TRUNC(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:30:00
(1 row)