使用一个函数获取两个日期之间的日期列表

73

我的问题类似于这个MySQL问题,但是我想问的是针对SQL Server:

是否有一个函数或查询可以返回两个日期之间的日期列表?例如,假设有一个名为ExplodeDates的函数:

SELECT ExplodeDates('2010-01-01', '2010-01-13');

这将返回一个只有一列的表,其中包含以下值:

2010-01-01
2010-01-02
2010-01-03
2010-01-04
2010-01-05
2010-01-06
2010-01-07
2010-01-08
2010-01-09
2010-01-10
2010-01-11
2010-01-12
2010-01-13

我认为一个日历/数字表可能能够帮助我。


更新

我决定查看提供的三个代码答案以及执行结果 - 作为总批次的%:

越低越好

虽然数字表解决方案(由KM和StingyJack在他们的答案中使用)是我的最爱,但我已经接受了Rob Farley的答案,因为它是最快的,比数字表方案快了三分之二。

更新2

Alivia的答案更为简洁。我已经改变了已接受的答案。


4
执行时间如何?% 总批次用于识别瓶颈,而不是吞吐量。您是对实际函数调用进行基准测试还是与其一起测试所有其他内容?比较小批次和大批次的结果? (翻译后):关于执行时间呢?总批次的百分比用于确定瓶颈,而不是吞吐量。您是否正在对实际函数调用进行基准测试,还是同时测试其它内容?比较小批次和大批次的结果? - StingyJack
1
使用 SET STATISTICS TIME ON 命令,对所有三个函数传入 ('1/1/1998','12/31/2020') 参数进行测试,结果显示 CPU 时间为 0 毫秒,经过时间为 1 毫秒。但是当传入 ('1/1/1900','1921-11-27') 参数时,StingyJacks 函数无法处理该日期范围,Rob 的函数的 CPU 时间为 93 毫秒,经过时间为 93 毫秒,而我的函数的 CPU 时间为 0 毫秒,经过时间为 1 毫秒,看起来效果更好。@Dan Atkinson,你使用的是哪种测试方法?如果你包含了一次性数字表设置,那么这是非常有缺陷的方式,因为它不能反映实际使用的性能。 - KM.
@KM 和 @StingyJack。感谢你们教我正确的基准测试方法。KM,感谢你费心指出实际的基准测试结果。我会在我的数据库上运行一些测试,并相应地更新问题。再次感谢! - Dan Atkinson
你为什么改变了答案?Alivia的答案需要一个提示来确保它包含足够的值,而且它不是所要求的函数。 - Rob Farley
OP更改了最正确的答案,选择了Alivia的答案,因为它更加“简洁”。这是一个非常糟糕的决定,因为它也需要更多的CPU资源,速度与普通WHILE循环一样慢,比事务WHILE循环还要慢,并且逻辑I/O使用量比普通WHILE循环高8倍。我强烈建议避免使用这种方法(增量递归CTE或rCTE)。Rob Farely的答案是一个iTVF(内联表值函数),使得使用比rCTE方法更加容易。 - Jeff Moden
显示剩余2条评论
21个回答

-1
WITH TEMP (DIA, SIGUIENTE_DIA ) AS
           (SELECT 
               1, 
               CAST(@FECHAINI AS DATE)
            FROM 
               DUAL
           UNION ALL
            SELECT 
               DIA, 
               DATEADD(DAY, DIA, SIGUIENTE_DIA)
            FROM 
               TEMP
            WHERE
               DIA < DATEDIFF(DAY,  @FECHAINI, @FECHAFIN)   
               AND DATEADD(DAY, 1, SIGUIENTE_DIA) <=  CAST(@FECHAFIN AS DATE)
           )
           SELECT 
              SIGUIENTE_DIA AS CALENDARIO 
           FROM
              TEMP
           ORDER BY   
              SIGUIENTE_DIA

详细信息在DUAL表中,但如果您将此表替换为虚拟表,则可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接