我需要填充一个表格,该表格将存储两个给定日期之间的日期范围:09/01/11 - 10/10/11
所以在这种情况下,该表将从 09/01/11 开始并每天存储到 10/10/11 我想知道在 SQL Server 中是否有一种巧妙的方法 - 我目前正在使用 SQL Server 2008 。 谢谢
原文由 Nate Pet 发布,翻译遵循 CC BY-SA 4.0 许可协议
我需要填充一个表格,该表格将存储两个给定日期之间的日期范围:09/01/11 - 10/10/11
所以在这种情况下,该表将从 09/01/11 开始并每天存储到 10/10/11 我想知道在 SQL Server 中是否有一种巧妙的方法 - 我目前正在使用 SQL Server 2008 。 谢谢
原文由 Nate Pet 发布,翻译遵循 CC BY-SA 4.0 许可协议
尝试以下代码:
DECLARE @DateStart DATE = '2021-01-20' , @DateEnd DATE = '2021-01-29';
with Extract_Dates_CTE (MyDate) as (
select @DateStart
Union ALL
select DATEADD(day, 1, MyDate)
from Extract_Dates_CTE
where MyDate < @DateEnd
)
select ROW_NUMBER() OVER(ORDER BY a.MyDate) AS RowDateID, a.MyDate AS ExtractedDates
from Extract_Dates_CTE a;
检查性能,我发现使用 CTE 方法具有更好的性能,如图所示。为此,我使用了两个查询并使用 SQL Server 工具显示了性能。
DECLARE @DateStart DATE = '2021-01-20' , @DateEnd DATE = '2021-01-29';
with Extract_Dates_CTE (MyDate) as (
select @DateStart
Union ALL
select DATEADD(day, 1, MyDate)
from Extract_Dates_CTE
where MyDate < @DateEnd
)
select ROW_NUMBER() OVER(ORDER BY a.MyDate) AS RowDateID, a.MyDate AS ExtractedDates
from Extract_Dates_CTE a;
SELECT DATEADD(DAY, nbr - 1, @DateStart)
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY c.object_id ) AS nbr
FROM sys.columns c
) nbrs
WHERE nbr - 1 <= DATEDIFF(DAY, @DateStart, @DateEnd)
原文由 AliNajafZadeh 发布,翻译遵循 CC BY-SA 4.0 许可协议
1 回答2.4k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
800 阅读
易于使用 SQL 2005+;如果您有数字或计数表,则更容易。我在下面伪造了它:
如果您有一个计数表,请将子查询替换为该表。没有递归。
编辑:由于人们似乎对计数表有疑问,让我使用一个从零开始的计数表来重写它。首先,这里有一些创建和填充表格的代码。
现在,您将 numbers 表作为数据库中的永久对象,您可以将其重用于子查询的查询 INSTEAD。该查询还被编辑为使用从零开始的计算。
高性能,并且没有递归。