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)
上一篇: golang 单元测试(一)
下一篇: 分享sql 查询结果的一个预处理小技巧