SQL获取本月、上月、下月的第一、最后一天日期
以MySQL为例,其他数据库大同小异。
获取当前日期
select curdate();
curdate() |
----------+
2023-07-07|
MySQL的内置函数,多数数据库都有。
获取本月最后一天
select last_day(curdate());
last_day(curdate())|
-------------------+
2023-07-31|
MySQL的内置函数last_day()
,可直接获取日期所在月份的最后一天日期。
获取月份日期的日期值
select day(curdate());
day(curdate())|
--------------+
MySQL内置函数day()
,传入日期可获取该日期所在月份的日期值。
同理还可以获取月份值:month()
。
日期添加指定的时间间隔
DATE_ADD(date,INTERVAL expr type)
select date_add(curdate(), interval 1 day);
date_add(curdate(), interval 1 day)|
-----------------------------------+
2023-07-08|
MySQL内置函数,可以给一个日期添加(或减少)指定天数。
上月最后一天
select date_add(last_day(curdate()), interval -1 month);
date_add(last_day(curdate()), interval -1 month)|
------------------------------------------------+
2023-06-30|
last_day(curdate())
,获取当前月份的最后一天,是2023-07-31
;
interval -1 month
,偏移量是向前1个月;
所以date_add(last_day(curdate()), interval -1 month)
表示本月最后一天向前偏移一个月。
同理可以求前X个月的最后一天,只需要改变interval -1 month
为需要的月份偏移量即可。
下月最后一天
select date_add(last_day(curdate()), interval 1 month);
date_add(last_day(curdate()), interval 1 month)|
-----------------------------------------------+
2023-08-31|
与获取上月最后一天原理相同,只需要将偏移量改为正数。
同理也可以获取后X个月的最后一天,修改interval 1 month
为需要的月份偏移量即可。
本月第一天
select date_add(curdate(), interval - day(curdate()) + 1 day);
date_add(curdate(), interval - day(curdate()) + 1 day)|
------------------------------------------------------+
2023-07-01|
day(curdate())
,当前日期是7日,所以结果是7
;
interval - day(curdate()) + 1 day
表示时间间隔是- day(curdate()) + 1 day
,即时间间隔是本月过去的天数减一天,也就是-7+1=-6
天;
所以date_add(curdate(), interval - day(curdate()) + 1 day)
的意思就是当前日期 + (-本月过去的天数 + 1)
。
上月第一天
select date_add(curdate()-day(curdate())+1, interval -1 month);
date_add(curdate()-day(curdate())+1, interval -1 month)|
-------------------------------------------------------+
2023-06-01 |
首先看curdate()-day(curdate())+1
,当前日期-当前月份天数+1
,其实就是取当前月的第一天,以今天为例,20230707-7+1=20230701
;
然后偏移量为interval -1 month
表示向前推1个月;
最终结果就是当前月的第一天 - 1个月
得到上个月的第一天。
同理可以取前x个月的第一天,只需要改变interval -1 month
为需要的月份偏移量即可。
下月第一天
select date_add(curdate()-day(curdate())+1, interval 1 month);
date_add(curdate()-day(curdate())+1, interval 1 month)|
------------------------------------------------------+
2023-08-01 |
与“上月第一天”原理相同,最后偏移量为正数月份即可。同理可获取后x个月的第一天。