trunc函数在日期比较和事务执行中是经常要使用到的一个函数,以前使用比较多的是忽略参数fmt的应用,这时默认返回的是距离当前最近的上一个整数日期.比如语句select trunc(sysdate) from dual;就可以返回当天的整数时间.
日前系统中有个业务处理,需要定时每小时执行一次预定义事务,开始时定义下一个执行时间为 sysdate +1/24,后来发现下一次的执行时间,oracle是在事务执行完成之后才进行计算的.本来我设想是在每个整点执行过程,结果由于事务需要执行1分钟,这样每次执行时间间隔就变成了一个小时零一分钟,顺延.
有点不爽,于是找了下资料,发现原来我们还可以使用带fmt参数的trunc函数解决这个问题,于是将执行时间修改为trunc(sysdate,'HH')+1/24于是问题解决.
下面顺便整理一下oracle文档中关于这个函数的解释.
-----------------------------------------------------------------------
TRUNC (date)
The TRUNC
(date) function returns date with the time portion of the day truncated to the unit specified by the format model fmt. The value returned is always of datatype DATE
, even if you specify a different datetime datatype for date. If you omit fmt, then date is truncated to the nearest day.
(个人翻译,不保证准确性:) trunc(date)函数可以根据指定的fmt参数返回一个格式化的日期,并总是返回日期类型数据,如果忽略fmt参数,则默认返回格式化到天的日期类型.
trunc函数的参数Fmt
参数 实例及说明
CC,SCC
取整当前时间所在年份到前两位,然后加一.比如当前年份为2008,那么取整前两位后得到2000,然后加1得到2001.
SELECT trunc(to_date('20080702 08:05:21 ','YYYYMMDD HH24:MI:SS'),'CC') FROM dual;
2001-01-01
-------------------------
SYYYY,YYYY,YEAR,SYEAR,YYY,YY,Y
格式化日期到日期所在年份
SELECT trunc(to_date('20080702 08:05:21 ','YYYYMMDD HH24:MI:SS'),'YYYY') FROM dual;
2008-01-01
----------------------------
IYYY,IY,IYI
去年年底
SELECT trunc(to_date('20080702 08:05:21 ','YYYYMMDD HH24:MI:SS'),'IY') FROM dual;;
2007-12-31
----------------------------
Q 给定日期所在季度的第一天
SELECT trunc(to_date('20080702 08:05:21 ','YYYYMMDD HH24:MI:SS'),'Q') FROM dual;
2008-07-01
----------------------------
MONTH,MON,MM,RM
给定日期所在月份的第一天
SELECT trunc(to_date('20080702 08:05:21 ','YYYYMMDD HH24:MI:SS'),'MONTH') FROM dual;
2008-7-1
----------------------------
WW
给定日期所在星期的第一天,也就是当周的周日
SELECT trunc(to_date('20081010 08:05:21 ','YYYYMMDD HH24:MI:SS'),'WW') FROM dual;
2008-10-7
----------------------------
IW Same day of the week as the first day of the ISO year
----------------------------
W Same day of the week as the first day of the month
----------------------------
DDD,DD,J,
Day
SELECT trunc(to_date('20081010 08:05:21 ','YYYYMMDD HH24:MI:SS'),'DD') FROM dual;
2008-10-10
----------------------------
DAY,DY,D
Starting day of the week
------------------------------
HH,HH12,HH24
Hour
SELECT trunc(to_date('20081010 08:05:21 ','YYYYMMDD HH24:MI:SS'),'HH24') FROM dual;
2008-10-10 8:00:00
----------------------------
MI Minute
SELECT trunc(to_date('20081010 08:05:21 ','YYYYMMDD HH24:MI:SS'),'MI') FROM dual;
2008-10-10 8:05:00