很抱歉,如果有人问这个,但我在搜索时找不到任何内容:我在SQL Server中有一个大约100k行的表。在每一行中都有一个日期范围,在许多情况下,这个日期范围分布在多个月(以及较小程度的年份)。范围通常约为30-35天,但它们通常不会在当月1日开始。典型日期范围的示例是01/10 / 2017-02 / 11/2017。
我正在寻找最有效的方式来输出该范围内最多天数的月份,因为它是自己的专栏。我今年做了同样的事情
现在我的查询中有以下内容:
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
该方法运行正常,但是当对表中的所有行完成时,它会变慢。我可以将更多有效的替代品用于Main_Month和Main_Year列吗?
编辑回应评论:
答案 0 :(得分:1)
正如上面的评论所述,这个解决方案并不完全准确,但它反映了原始较慢解决方案的准确性:
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,然后从派生表中获取它以获得所需的两个字段。接下来,不要费心去做,因为Month()和year()都为你做了。你能用这种方法看到速度差异吗?
答案 1 :(得分:0)
我认为使用CASE语句会更有效率,如果你可以避免强制转换,就像这样:
mouseout