在SQL中选择多个月范围内最多天数的月份

在SQL中选择多个月范围内最多天数的月份,sql,sql-server,date,datediff,dateadd,Sql,Sql Server,Date,Datediff,Dateadd,如果有人问这个问题,很抱歉,但我在搜索时没有找到任何东西:我在SQL Server中有一个约10万行的大表。在每一行中都有一个日期范围,在许多情况下,该范围在较小程度上跨越多个月和几年。范围通常为30-35天,但通常不是从月1日开始。典型日期范围的示例为2017年10月1日至2017年11月2日 我正在寻找一种最有效的方法来输出该范围内天数最多的月份,因为它是自己的列。我今年也在做同样的事情 现在我的查询中有以下内容: SELECT DISTINCT a.START_DATE, a

如果有人问这个问题,很抱歉,但我在搜索时没有找到任何东西:我在SQL Server中有一个约10万行的大表。在每一行中都有一个日期范围,在许多情况下,该范围在较小程度上跨越多个月和几年。范围通常为30-35天,但通常不是从月1日开始。典型日期范围的示例为2017年10月1日至2017年11月2日


我正在寻找一种最有效的方法来输出该范围内天数最多的月份,因为它是自己的列。我今年也在做同样的事情

现在我的查询中有以下内容:

SELECT DISTINCT
   a.START_DATE, 
   a.END_DATE,
   cast(month(dateadd(day, datediff(day, a.Start_Date, a.End_Date)/2, a.Start_Date)) as tinyint) as Main_Month,
   cast(year(dateadd(day, datediff(day, a.Start_Date, a.End_Date)/2, a.Start_Date)) as smallint) as Main_Year
FROM TABLE
使用上述日期范围示例查询的输出将给出:

Start_Date: 01/10/2017 End_Date: 02/11/2017 Main_Month: 1 Main Year: 2017
该方法工作正常,但对表中的所有行执行时速度会减慢。有没有更有效的替代方案,我可以用于主月和主年列

根据评论进行编辑:

使用我的示例范围2017年10月1日至2017年11月2日,在一个日期范围内最多天数的月份,由于该范围在1月包含21天,在2月仅包含11天,因此我得到的主要月份的输出为1。此外,由于这一年是2017年,因此在整个范围内,我得到的主要年产量是2017年 对于领带,我会选择包含最多天数的第一个月。在2017年6月20日-2017年9月5日的例子中,我会选择7,因为这是第一个月,范围为31天
如上面评论中所述,该解决方案并非完全准确,但它反映了原始较慢解决方案的准确性:

SELECT b.START_DATE, b.END_DATE, month(b.mid_point) as Main_Month, year(b.midpoint) as Main_Year FROM
    (SELECT DISTINCT
       a.START_DATE, 
       a.END_DATE,
       dateadd(day, datediff(day, a.Start_Date, a.End_Date)/2, a.Start_Date) as mid_Point
    FROM a) as b

您应该能够通过进行这两个更改来加快速度。首先,只计算一次datediff和dateadd,然后从派生表获取所需的两个字段。下一步,不必费心选角,因为月份和年份都会为你选角。你能看到这种方法的速度差异吗?

我认为使用CASE语句可能更有效,如果你能避免使用cast,比如:

,  CASE WHEN datediff(day, a.Start_Date, a.End_Date) + 1 - DAY(a.END_Date) < DAY(a.END_DATE) THEN MONTH(a.End_Date) 
    ELSE MONTH(a.Start_Date) END AS Main_Month
 , CASE WHEN YEAR(a.END_Date) = YEAR(a.Start_Date) THEN YEAR(a.Start_Date)
        WHEN datediff(day, a.Start_Date, a.End_Date) + 1 - DAY(a.END_Date) < DAY(a.END_DATE) THEN  YEAR(a.End_Date) 
    ELSE YEAR(a.Start_Date) END AS Main_Year

我正在寻找一种最有效的方法来输出该范围内天数最多的月份,因为它是自己的列。我就是不明白。您能否同时提供示例数据和期望的结果?在您的业务逻辑中如何处理关系?例如,如果日期范围为2017年6月20日至2017年9月5日,则2017年7月和8月在此范围内都有31天。除了您对效率的关注之外,您应该知道您当前的代码并不能解决问题。它只返回范围中点的月份和年份,这可能根本不是最长的月份。例如,对于2017年1月10日-2017年4月2日,您的代码将给出2017年2月,而2017年3月实际有更多的天数。解决方案是否需要完全正确,或者它能允许1-2天的误差吗?这很有帮助-在这种情况下,你的方法实际上是一个很好的方法,因为计算简单,我们可以选择忽略不同的月长。这意味着这只是一个效率问题。它确实对性能有所帮助。谢谢你的帮助!如果在sql server中创建一个计算中点的视图,则可以在该视图上为中点列创建索引,并查看更多增益。嗯。。。我刚刚看到,日期范围可能涵盖一个多月,所以这可能不是很好的逻辑。即使如此,使用CASE缩小计算步骤的可能性仍然适用?