在上一章我们讲述了如何处理使用数值类型,本章具体介绍一下日期的计算处理

1、在某天的基础上加上或减去天、月、年

在不同的数据库格式和函数不同,但是都这么运用,我这举几个简单的例子,在今天的基础上的前2天,2月,2年

Oracle使用函数add_months():
sysdate-2;add_months(sysdate,-2);add_months(sysdate,-2*12)
Mysql:使用关键字interval指定时间单位和数量
now()-interval 2 day;now()-interval 2 month;now()-interval 2 year
也可以使用函数data_add():
date_add(now(),interval -2 day);date_add(now(),interval -2 month);date_add(now(),interval- 2 year)
PostgreSQL中同样使用interval指定,区别是单位和数量必须在单引号内。
now()-interval '2 day';now()-interval  '2 month' ;now()-interval  '2 year'
DB2直接运算:
sysdate-2 day;sysdate-2 month;sysdate-2 year
Sqlserver使用函数dateadd()
dateadd(day,-2,getdate());dateadd(month,-2,getdate());dateadd(year,-2,getdate());

2、确定两个日期相差多少天

计算两个日期字段starttime和endtime相差天数

DB2需要用函数days()转一下
days(starttime)-days(endtime)
Oracle和PostgreSQL日期类型可以直接运算
starttime-endtime
Mysql和Sqlserver使用函数datediff()
Mysql:datediff(starttime,endtime)
Sqlserver:datediff(day,endtime,starttime)

这里不得不提一下,计算里那个间隔时间相差多少秒、分钟、小时

Sqlserver:datediff(day,endtime,starttime,hour),datediff(day,endtime,starttime,minute),datediff(day,endtime,starttime,second)

其他的数据库都是在天数的基础上*12为小时,*12*60为分钟,*12*60*60为秒

3、计算两个日期之间有多少个工作日

计算工作日的方法有很多种,我们在这就举个例子提供思路,以Oracle为例

(1)单纯的计算

SELECT ((TO_NUMBER(TRUNC(to_date('2023-04-06','yyyy-mm-dd'), 'D') - TRUNC(to_date('2023-04-01','yyyy-mm-dd') + 6, 'D'))) / 7 * 5) +

 MOD(7 - TO_NUMBER(TO_CHAR(to_date('2023-04-01','yyyy-mm-dd'), 'D')), 6) +

 LEAST(TO_NUMBER(TO_CHAR(to_date('2023-04-06','yyyy-mm-dd'), 'D')) - 2, 5) days

 FROM dual;

(2)新建一张表hiredate,用于储存节假日期(周六,周日),然后使用not in 排除日期查询,但是各个数据库中计算日期是周几的函数各不相同

Oracle和PostgreSQL:trim(to_char(sysdate, 'day'))

DB2:dayname

Mysql:date_format

Sqlserver:datename

4、计算两个日期相隔多少年或多少月

数据库里面有对应的函数,思路是先计算日期相差多少月,在此基础上/12,就是相隔年份,我们在这就展示如何计算月份,大家自行计算年份。

Oracle:months_between(starttime,endtime) as mnth(或者使用下面PostgreSQL的函数extract)
PostgreSQL:(extract(year from starttime)+extract(year from endtime))*12 +(extract(month
extract()函数用于提取日期/时间的单独部分,比如年、月、日、小时、分钟等等。
DB2和Mysql:(year(starttime)-year(endtime))*12+(month(starttime)-month(endtime)) as mnth
Sqlserver可以根据参数直接计算间隔:datediff(month,endtime,starttime) as mnth ,
datediff(year,endtime,starttime) as years

扩展:

Oracle中有一个函数大家应该在日期中可以用得到

Oracle中trunc是截取的函数用在日期类型上,就是截取到日或时间。

以下为具体例子。

SELECT TRUNC(SYSDATE) FROM DUAL;默认是截取系统日期到日,

得到2012-12-19比如值为"2012-12-19 14:30:50"的日期变量TRUNC(SYSDATE)得到 2012-12-19 , 和TRUNC(SYSDATE,'DD')一样

TRUNC(SYSDATE,'YYYY'),得到2012-1-1

TRUNC(SYSDATE,'MM'),得到2012-12-1

TRUNC(SYSDATE,'DD'),得到2012-12-19

TRUNC(SYSDATE,'HH')或HH24,得到2012-12-19 14:00:00

TRUNC(SYSDATE,'MI'),得到2012-12-19 14:30:00

TRUNC(SYSDATE,'SS'),是会报错的,直接用SYSDATE不用TRUNC。