获取两个日期之间特定月份和年份的天数SQL
我想检索与特定月份重叠的两个日期之间的天数 例如:获取两个日期之间特定月份和年份的天数SQL,sql,sql-server,Sql,Sql Server,我想检索与特定月份重叠的两个日期之间的天数 例如: 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天
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月两个范围内重叠天数的通用公式为
MAX(MIN(end1, end2) - MAX(start1, start2) + 1, 0)
在您的情况下,有一组开始日期和结束日期,必须使用datefromparts和eomonth从给定的月份和年份构造另一组
不幸的是,SQLServer不像MySQL和Oracle那样支持最小和最大的公式,所以实现起来有点痛苦。下面是一个使用变量的示例:
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
);这包括其他样本日期范围
如果这些值是从表中导出的,您可以使用一系列CTE来实现类似的功能。如何在2019年11月12日到2020年1月13日之间获得13天?那是62天。。。2019年8月13日至2020年1月1日共有141天。你的逻辑毫无意义。我说我想检索特定月份的天数,作为一个参数,我应该输入月份数,在我的例子中,第一个例子是1,结果应该是13天。你的意思是你想计算两个日期之间的天数,但只计算特定月份的天数;因此,选择1意味着您只计算实际在1月份的两个日期之间的天数?1月份有31天,而不是13天。在这里解释你想要什么,它是完全不清楚的。请添加更多的例子,你的要求是完全不清楚的
13