【问题标题】:Getting number of days for a specific month and year between two dates SQL获取两个日期之间特定月份和年份的天数 SQL
【发布时间】:2020-01-30 19:46:10
【问题描述】:

我想检索与特定月份重叠的两个日期之间的天数。

例如:

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 月

【问题讨论】:

  • 2019 年 11 月 12 日到 2020 年 1 月 13 日之间的 13 天怎么算?那是 62 天……从 2019 年 8 月 13 日到 2020 年 1 月 1 日,有 141 天。你的逻辑毫无意义。
  • 我说我想检索特定月份的天数,作为参数我应该输入月份数,在我的情况下,第一个示例为 1,而不是 13 天结果
  • 你的意思是要计算两个日期之间的天数,但只计算特定月份;这样选择 1 意味着您只计算实际在一月份的两个日期之间的天数?
  • 一月有 31 天,而不是 13 天。在这里解释一下你的目的,完全不清楚。
  • 请添加更多示例,您的要求完全不清楚

标签: sql sql-server


【解决方案1】:

两个范围内重叠天数的通用公式是

MAX(MIN(end1, end2) - MAX(start1, start2) + 1, 0)

在您的情况下,您有一组开始日期和结束日期,您必须使用 datefrompartseomonth 从给定的月份和年份构造另一组。

不幸的是,SQL Server 不像 MySQL 和 Oracle 那样支持 LEASTGREATEST 公式,所以实现起来有点痛苦。下面是一个使用变量的例子:

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 来实现类似的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-20
    • 2017-01-19
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多