我想检索与特定月份重叠的两个日期之间的天数。
例如:
Month = 1
Year = 2020
StartDate ='2019-11-12'
ENDDate ='2020-1-13'
Result = 13 days
13,因为在所选月份的日期之间有13天:2020年1月
其他示例:
Month=9
Year =2019
StartDate = '2019-8-13'
ENDDate ='2020-1-1'
Result = 30 days
30,因为在所选月份的日期之间有30天:2019年9月
答案 0 :(得分:1)
两个范围内的重叠天数的通用公式为
MAX(MIN(end1, end2) - MAX(start1, start2) + 1, 0)
如果您有一组开始日期和结束日期,则必须使用datefromparts
和eomonth
从给定的月份和年份构造另一组日期。
不幸的是,SQL Server不像MySQL和Oracle一样支持LEAST
和GREATEST
公式,因此实现起来有些麻烦。这是使用变量的示例:
declare @month int;
declare @year int;
declare @startDate date;
declare @endDate date;
declare @startOfMonth date;
declare @endOfMonth date;
declare @minEnd date;
declare @maxStart date;
set @month = 1;
set @year = 2020;
set @startDate = '2019-11-12';
set @endDate = '2020-01-13';
set @startOfMonth = datefromparts(@year, @month, 1)
set @endOfMonth = eomonth(@startOfMonth)
set @minEnd = case when @endDate < @endOfMonth then @endDate
else @endOfMonth
end;
set @maxStart = case when @startDate < @startOfMonth then @startOfMonth
else @startDate
end;
select case when datediff(day, @maxStart, @minEnd) + 1 < 0 then 0
else datediff(day, @maxStart, @minEnd) + 1
end as days_in_month
输出:
13
Demo on dbfiddle;这包括其他示例日期范围。
如果值是从表派生的,则可以使用一系列CTE来实现类似的功能。