【发布时间】:2010-11-25 14:27:12
【问题描述】:
我的问题类似于this 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
我在想日历/数字表可能可以帮助我。
更新
我决定查看提供的三个代码答案,执行结果(占总批次的百分比)是:
- Rob Farley's answer:18%
- StingyJack's answer:41%
- KM's answer:41%
越低越好
我接受了 Rob Farley 的回答,因为它是最快的,尽管数字表解决方案(KM 和 StingyJack 在他们的回答中都使用)是我最喜欢的。 Rob Farley 的速度要快三分之二。
更新 2
Alivia 的answer 更简洁。我已更改接受的答案。
【问题讨论】:
-
SQL 中的循环性能将成为 S U C K。尝试这些答案时请记住这一点。
-
执行时间呢?总批次的百分比用于识别瓶颈,而不是吞吐量。您是在对实际的函数调用或其他所有内容进行基准测试吗?比较小批量和大批量的结果?
-
使用 SET STATISTICS TIME ON 所有三个用 ('1/1/1998','12/31/2020') 调用的函数报告相同的 CPU 时间 = 0 毫秒,经过的时间 = 1 毫秒.当使用 ('1/1/1900','1921-11-27') 调用 Rob's 和 mine 时,StingyJacks 无法执行该日期范围,我得到 Rob's 为:CPU 时间 = 93 毫秒,经过时间 = 93 毫秒。我得到了我的:CPU时间= 0毫秒,经过时间= 1毫秒,我的看起来好多了。你使用什么测试方法@Dan Atkinson?如果您包括一次性数字表设置,这是一种非常有缺陷的方式,因为它不能反映实际的使用性能。
-
@KM 和@StingyJack。感谢你们教育我正确的基准测试方法。还有KM,感谢您不厌其烦地指出实际的基准测试结果。我将在我的数据库上运行一些并相应地更新问题。再次感谢!
-
你为什么改变答案? Alivia 的回答需要提示以确保它包含足够的值,并且它不是所要求的函数。
标签: sql-server date