在 Date Dimension table 的 while 循环条件中使用 DATEDIFF 添加 30 天的存储过程

Stored procedure to add 30 days using DATEDIFF within while loop condition in Date Dimension table

我想使用 DATEDIFF() 在我的日期维度 table 中添加连续 30 天的数据,但我得到的结果是空白。你能帮我更正下面的代码以获得想要的结果吗?

CREATE TABLE dbo.dateDimension (
    DateKey INT NOT NULL
    ,DateValue DATE NOT NULL
    ,CYear SMALLINT NOT NULL
    ,CMonth TINYINT NOT NULL
    ,CONSTRAINT PK_DimDate PRIMARY KEY ( DateKey )
);
GO

CREATE PROC dbo.dateTest 
@StartDate DATETIME
AS
WHILE (DATEDIFF(day, @StartDate, GETDATE()) <=30)
BEGIN
    INSERT into dbo.dateDimension
    SELECT CAST( YEAR(@StartDate) * 10000 + MONTH(@StartDate) * 100 + DAY(@StartDate) AS INT)
    ,@StartDate
    ,YEAR(@StartDate)
    ,MONTH(@StartDate)
    SET @StartDate = DATEADD(d,1,@StartDate)
END;
GO

EXECUTE dbo.dateTest '2010-01-01'
SELECT * FROM dbo.dateDimension

问题是这个逻辑:

DATEDIFF(day, @StartDate, GETDATE())

您当前的开始日期为 3739 天,因此不会少于 30 天。我个人会简单地计算如下:

DECLARE @StartDate DATETIME = '2010-01-01', @Count INT = 0;

WHILE @Count <= 30 BEGIN
    INSERT into dbo.dateDimension
    SELECT CAST( YEAR(@StartDate) * 10000 + MONTH(@StartDate) * 100 + DAY(@StartDate) AS INT)
        , @StartDate
        , YEAR(@StartDate)
        , MONTH(@StartDate);
    SET @StartDate = DATEADD(d,1,@StartDate);
    set @Count = @Count + 1;
END;

SELECT *
FROM dbo.dateDimension;

如果您使用的是 SQL Server 2016 或更高版本,此解决方案不会使用 while 循环,而是使用 CTE 生成编号为 I 到 30 的 30 行,然后使用日期转换为 yyyymmdd.

DECLARE @NUM_DAYS INT=30;
DECLARE @STARTDATE DATETIME='2020-01-01';

WITH CTE AS(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS SRL
    FROM STRING_SPLIT(REPLICATE(',',@num_days-1), ',') AS A
) 
INSERT INTO dbo.dateDimension
SELECT 
    CONVERT(INT, CONVERT(CHAR(8), DATEADD(DAY, SRL-1, @STARTDATE), 112))
    , @STARTDATE
    , YEAR(@STARTDATE)
    , MONTH(@STARTDATE)
FROM CTE

SELECT * FROM dbo.dateDimension