DATEDIFF
需求:查询截至于2021年7月15号的前10天的用户订单记录(不包括15号)
像这种对于一个具体日期往前或者往后推多少多少天的sql查询,我们一般能想到的可能是用具体的一个临界日期来设置条件:
2021.7.15号的前10天就是2021.7.5号,然后sql可以这么写:
select * from userOrder where bugDate > '2021-07-05' and bugDate < '2021-07-15'
# 或者用between and 也可以
这样也是可行的,但是呢,需要自己演推出10天前的具体日期,但是实际的开发中往往是动态的,不仅仅只要7.15号的前10天,还有可能是其他日子,7.16前10天,7.30前10天·······
那就需要用上MySQL一个函数-------DATEDIFF
语法格式:里面就两个参数,都是放的时间,然后它会算出两个时间差
# 语法格式
DATEDIFF('2010-6-22','2010-6-28')
举个例子: 一正一反
SELECT DATEDIFF('2010-6-22','2010-6-20') AS DiffDate from dual
SELECT DATEDIFF('2010-6-20','2010-6-22') AS DiffDate from dual
仔细观察这两副图:左大右小是正数,左小右大是负数,然后那个问题就可以用这个函数解决了:
## 查询截至于2021年7月15号的前10天的用户订单记录(不包括15号)
select * from userOrder where DATEDIFF(bugDate,'2021-07-15') < 4 and ('2021-07-15',bugDate) >0
重点!重点!重点!!!!
很多人会漏了一个小细节------------------------------>>>>>>>>>>>>>>>>
这里提一句,为什么还要加一个大于0的条件:因为 左小右大是负数 比如2021-07-16 是小于0的,如果没加它也会查出来,在顺带说一句,datediff函数,返回值是相差的天数,不能定位到小时、分钟和秒。
要是暂时没理解,建议自己去数据库造数据查一遍就很块理解了
TIMESTAMPDIFF
需求:(是上一个DATEDIFF的需求升级版)
查询截至于2021年7月15号的前2年的用户订单记录(不包括15号)
这个需求升级的地方在于时间范围的计量单位变了,若是用原先的做法也不是不可以,算一下2年有多少天,然后照样用datediff做,但是应该都不会这样去玩吧,所以TIMESTAMPDIFF函数了解一下,可以说是上一个的升级版。
**语法格式:**里面三个参数,一个计量单位(年、月、日·····),一个时间、一个时间
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
MICROSECOND 微秒
SECOND 秒
MINUTE 分钟
HOUR 小时
DAY 天
WEEK 周
MONTH 月份
QUARTER
YEAR 年份
直接上例子:
SELECT TIMESTAMPDIFF(MONTH, '2022-10-04' , '2022-12-04') a ,TIMESTAMPDIFF(MONTH, '2022-10-05' , '2022-12-04') b from dual
参数是MONTH,计算两个时间相差多少个月,注意,它算的是满月,如上图,结束时间都是4号,但是开始时间一个是4号一个是5号,结果是不一样的,但是如果你是2个月多6天7天,它结果还是算2个月的,所以它只算满月。
说一个实用的,我们可以用year参数来算自己的岁数:
SELECT TIMESTAMPDIFF(YEAR, '2000-9-27' , now()) age from dual;
如果碰上需要时分秒,也可以加上,像这样:
SELECT TIMESTAMPDIFF(MINUTE , '2000-9-27 05:33:00' , '2000-9-27 05:43:00') age from dual;