MySQL的日期时间计算速查表

2023-04-08 10:30:03 浏览数 (1)

最近写个SQL逻辑,涉及到计算各种日期和时间,MySQL提供了很丰富的函数来支持,记录一下,用的时候,有地方可查。

代码语言:javascript复制
获取当前日期
select curdate(); 


获取当月最后一天
select last_day(curdate());


获取本月第一天
select DATE_ADD(curdate(),interval -day(curdate()) 1 day);


上月第一天
select date_add(curdate()-day(curdate()) 1,interval -1 month);


上月最后一天
select last_day(date_sub(now(),interval 1 month));


获取下个月的第一天
select date_add(curdate()-day(curdate()) 1,interval 1 month);


下月最后一天
select last_day(date_sub(now(),interval -1 month));


获取当前月的天数
select DATEDIFF(date_add(curdate()-day(curdate()) 1,interval 1 month ),DATE_ADD(curdate(),interval -day(curdate()) 1 day)) from dual;
select day(last_day(curdate()));


查询当前年份新增数据
select * from test where YEAR(create_time) = YEAR(NOW())


查询当去年份新增数据
select * from test where YEAR(create_time) = YEAR(NOW())-1


查询当前季度新增数据
select * from test where QUARTER(create_time) = QUARTER(NOW()) AND YEAR (create_time) = YEAR (NOW())


查询上个季度新增数据
select * from test where QUARTER(create_time) = QUARTER(DATE_SUB(now(),interval 1 QUARTER))


查询本月新增数据
select * from test where DATE_FORMAT( create_time, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )


查询上个月新增数据
select * from test where DATE_FORMAT(create_time,'%Y%m') = DATE_FORMAT(DATE_SUB(curdate(), interval 1 MONTH),'%Y%m')


得到上一季度
DATE_SUB(CURDATE(),interval 1 QUARTER)


今天是当月的第几天
SELECT DAYOFMONTH(NOW());


上月今天的当前日期
select date_sub(curdate(), interval 1 month);


上月今天的当前时间(时间戳)
select unix_timestamp(date_sub(now(),interval 1 month));


获取当前时间与上个月之间的天数
select datediff(curdate(), date_sub(curdate(), interval 1 month));


当前quarter的第一天
select concat(date_format(LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM  CURDATE()),1)   interval QUARTER(CURDATE())*3-3 month),'%Y-%m-'),'01');


当前quarter的最后一天
select LAST_DAY(MAKEDATE(EXTRACT(YEAR  FROM CURDATE()),1)   interval QUARTER(CURDATE())*3-1 month);


前一quarter的第一天 
select concat(date_format(LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1)   interval QUARTER(CURDATE())*3-6 month),'%Y-%m-'),'01');


前一quarter的最后一天
select LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1)   interval QUARTER(CURDATE())*3-4 month);

DATE_FORMAT():函数用于以不同的格式显示日期/时间数据,

代码语言:javascript复制
语法:DATE_FORMAT(date,format)
date,参数是合法的日期
format,规定日期/时间的输出格式。
%a 缩写星期名
%b 缩写月名
%c 月,数值
%D 带有英文前缀的月中的天
%d 月的天,数值(00-31)
%e 月的天,数值(0-31)
%f 微秒
%H 小时 (00-23)
%h 小时 (01-12)
%I 小时 (01-12)
%i 分钟,数值(00-59)
%j 年的天 (001-366)
%k 小时 (0-23)
%l 小时 (1-12)
%M 月名
%m 月,数值(00-12)
%p AM 或 PM
%r 时间,12-小时(hh:mm:ss AM 或 PM)
%S 秒(00-59)
%s 秒(00-59)
%T 时间, 24-小时 (hh:mm:ss)
%U 周 (00-53) 星期日是一周的第一天
%u 周 (00-53) 星期一是一周的第一天
%V 周 (01-53) 星期日是一周的第一天,与 %X 使用
%v 周 (01-53) 星期一是一周的第一天,与 %x 使用
%W 星期名
%w 周的天 (0=星期日, 6=星期六)
%X 年,其中的星期日是周的第一天,4 位,与 %V 使用
%x 年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y 年,4 位
%y 年,2 位

QUARTER():函数返回给定日期值(1到4之间的数字)的一年中的季度,

代码语言:javascript复制
语法:QUARTER(date)
date,必须项。从中提取季度的日期或日期时间

返回值,

月份

返回值

1~3月

1

4~6月

2

7~9月

3

10~12月

4

INTERVAL,

(1)当函数使用时,即interval()为比较函数,例如:interval(10,1,3,5,7); 结果为4。

原理:10为被比较数,后面1,3,5,7为比较数,将后面四个依次与10比较,看后面数字组有多少个少于10,则返回其个数。前提是后面数字组为从小到大排列,否则返回结果0。

(2)当关键词使用时,表示为设置时间间隔,常用在date_add()与date_sub()函数里,例如:interval 1 day ,解释为将时间间隔设置为1天。

参考资料,

https://www.cnblogs.com/Rukh/p/16698942.html

https://www.cnblogs.com/luojie-/p/16549749.html

https://blog.csdn.net/bj_chengrong/article/details/100655333

0 人点赞