Oracle查询优化改写技巧与案例 第七章 日期运算
7.1日期类型
Oracle中常用的时间类型有两个:DATE和TIMESTAMP。
DATE精度到秒,TIMESTAMP可以保存秒的小数:
DATE类型相减得到的结果为整型,单位是天。
TIMESTAMP类型相减或TIMESTAMP与DATE相减得到的结果类型是INTERVAL。
DATE和TIMESTAMP两种类型加减一个数值得到的结果类型都是DATE:
7.2日期计算
如上节所述,Oracle中日期可以直接进行计算,加1就是1天,那么1/24就是1小时,分与秒的加减类似:
7.3时间间隔类型
如上节所述,TIMESTAMP与数值加减后得到的是DATE类型,损失了精度。如果要保留精度可以改用时间间隔类型(INTERVAL)处理,我们可以通过函数INTERVAL来得到间隔值:


则当前时间加一天可写为:
当然,DATE类型也可以通过INTERVAL进行计算,结果类型仍为DATE:
7.4日期计算函数
在Oracle中,DATE类型可以直接加减天数,而加减月份要用add_months函数:
月份加减需要注意的问题:
如上所示,当计算上月同期时可能会重复计算28号的数据。
同理,计算去年同期时也会发生重复计算的现象,而且因四年一遇更难发现:
月份加减不能使用INTERVAL类型:
因为没有2018-02-29,所以此时报错。
7.5间隔月份
Oracle两个DATE相减的结果以天为单位,如果想得到间隔的月份需要使用函数:
该函数同样有前面提到过的计算问题,使用的时候需要注意是否影响需求:
7.6获取记录间的间隔时间
我们经常需要取记录间的间隔时间,比如公司想知道部门20招聘员工的间隔时间。JOINE与SMITH之间的间隔就是1981.04.02-1980.12.17。
我们可以通过生成的序号来关联取值:
也可以通过lag分析函数直接取得上一个记录的信息:
lag和lead分别取前后的数据,如果记不住可以先看执行结果再决定用哪一个:

