在上一章我们讲述了如何处理使用数值类型,本章具体介绍一下日期的计算处理
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 from starttime)+extract(month from endtime)) as mnth
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。
原文链接:https://blog.csdn.net/hht006158/article/details/82460041
好了,就先介绍到这里了。本文相对较为简单,我们会在下一张继续介绍关于日期的操作