欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SQL Server上月同期 日期的计算

程序员文章站 2022-06-05 09:27:32
...

遇到个需求,上月同期的日期计算,导致上月同期的数据少计算了1天,(此处的上月同期为 日期的截止日期,例:create_date < 上月同期截止日期),这里也包括了闰年的特殊情况
以下是一些测试用例:

如今天是 2019-10-31 上月同期就是 2019-10-1,
今天是 2019-10-30,上月同期  2019-9-30
今天是2019-3-29,上月同期为 2019-3-1
今天是2019-3-30 上月同期为 2019-3-1
今天是2020-3-29,上月同期为2020-2-29
今天是 2020-3-30 上月同期为 2020-3-1
declare  @start  datetime --开始日期
declare  @end  datetime -- 结束日期
declare  @today  datetime /*今天*/
declare  @tomorrow datetime /*明天*/

set @today = GETDATE()
set @tomorrow =dateadd(day,1,@today)
set @start = CONVERT(varchar(7), dateadd(mm,-1,@today) , 120) + '-01' -- 开始默认上月1号
set @end =  CONVERT(varchar(10), dateadd(mm,-1,@today)  , 120) -- 结束默认上月的今天
-- 如果今天是1号,上月开始时间为 上上月1号,结束为上月1号
if DAY(@today)=1 set @start = CONVERT(varchar(7),  dateadd(mm,-2,@today)  , 120)+ '-01' 
if DAY(@today)=1 set @end = CONVERT(varchar(7),  dateadd(mm,-1,@today)  , 120)+ '-01'

-- 如果今天是月末且月份在(1,3,5,7,10) 或  今天是3月30   或今天是平年的 2月29 
-- 这些条件的截止日期为上月今天+1,即本月1号
if (  datediff(month,@today,@tomorrow) = 1 and MONTH(@today) in(1,3,5,7,10)   ) 
		or (  MONTH(@today)=3 and DAY(@today)=30 ) 
		or ( MONTH(@today)=3 and DAY(@today)=29 and YEAR(@today)%4!=0 and YEAR(@today)%400!=0 
 )
	set @end = CONVERT(varchar(10),  dateadd(mm,-1,@today)+1  , 120)