生成日期范围之间的日期

新手上路,请多包涵

我需要填充一个表格,该表格将存储两个给定日期之间的日期范围:09/01/11 - 10/10/11

所以在这种情况下,该表将从 09/01/11 开始并每天存储到 10/10/11 我想知道在 SQL Server 中是否有一种巧妙的方法 - 我目前正在使用 SQL Server 2008 。 谢谢

原文由 Nate Pet 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 847
2 个回答

易于使用 SQL 2005+;如果您有数字或计数表,则更容易。我在下面伪造了它:

 DECLARE @StartDate DATE = '20110901'
  , @EndDate DATE = '20111001'

SELECT  DATEADD(DAY, nbr - 1, @StartDate)
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY c.object_id ) AS nbr
          FROM      sys.columns c
        ) nbrs
WHERE   nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate)

如果您有一个计数表,请将子查询替换为该表。没有递归。

编辑:由于人们似乎对计数表有疑问,让我使用一个从零开始的计数表来重写它。首先,这里有一些创建和填充表格的代码。

 CREATE TABLE [dbo].[nbrs](
    [nbr] [INT] NOT NULL
) ON [PRIMARY]
GO

CREATE UNIQUE CLUSTERED INDEX [clidx] ON [dbo].[nbrs]
(
    [nbr] ASC
)
GO

INSERT INTO dbo.nbrs (nbr)
SELECT nbr-1
FROM ( SELECT    ROW_NUMBER() OVER ( ORDER BY c.object_id ) AS nbr
          FROM      sys.columns c
        ) nbrs
GO

现在,您将 numbers 表作为数据库中的永久对象,您可以将其重用于子查询的查询 INSTEAD。该查询还被编辑为使用从零开始的计算。

 DECLARE @StartDate DATE = '20110901'
      , @EndDate DATE = '20111001'

SELECT  DATEADD(DAY, nbr, @DateStart)
FROM    nbrs
WHERE   nbr <= DATEDIFF(DAY, @DateStart, @DateEnd)

高性能,并且没有递归。

原文由 Stuart Ainsworth 发布,翻译遵循 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;

执行 SQL Server 代码的结果如图所示。

检查性能,我发现使用 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进