数据库语法总结(8)——计算日期

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

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

好了,就先介绍到这里了。本文相对较为简单,我们会在下一张继续介绍关于日期的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值