Хранимая процедура добавления 30 дней с использованием DATEDIFF в течение условия l oop в таблице измерения даты - PullRequest
0 голосов
/ 28 марта 2020

Я хочу добавить данные 30 дней подряд в мою таблицу Date Dimension, используя DATEDIFF (), но я получаю пустой результат. Не могли бы вы помочь мне исправить приведенный ниже код, чтобы получить желаемый результат?

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

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Если вы используете SQL Server 2016 или выше, это решение не будет использовать некоторое время l oop, вместо этого оно использует CTE для генерации 30 строк с номерами от I до 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
0 голосов
/ 28 марта 2020

Проблема в том, что эта логика c:

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;
...