SQL Вставка новых годов в календарь - PullRequest
0 голосов
/ 28 февраля 2020

Я совершенно новичок в SQL, меня все еще просят помочь, потому что больше некому это делать.

Среди прочего, что я понял, я не могу понять, как добавить дополнительный год к таблица Calendar в базе данных SQL Server.

Таблица была установлена ​​на 8 лет, начиная с января 2013 года и заканчивая в этом декабре. Можно ли продлить до наступления этой даты?

Единственный синтаксис, который я придумал:

INSERT INTO dim.calendar [ (PK, date, year...) ] 
VALUES (20210101, 2021-01-01, 2021 ...)

Но я почти уверен, что должен быть другой, самый быстрый путь на велосипеде параметров дат внутри года.

Спасибо за любую помощь

information scheme

table itself

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Самый быстрый способ генерировать такие данные - Tally. Этого должно быть более чем достаточно, чтобы вы пошли по правильному пути:

DECLARE @StartDate date = '20000101',
        @EndDate date = '20201231';

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT TOP (DATEDIFF(DAY, @StartDate, @EndDate)+1)
           ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
    FROM N N1, N N2, N N3, N N4, N N5), --100,000 days, more than enough, but add more cross joins to N for more
Dates AS(
    SELECT DATEADD(DAY, T.I, @StartDate) AS CalendarDate
    FROM Tally T)
--INSERT INTO dbo.CalendarTable
SELECT CONVERT(varchar(8),D.CalendarDate,112) AS PK,
       D.CalendarDate,
       DATEPART(YEAR, D.CalendarDate) AS CalendarYear,
       DATEPART(MONTH, D.CalendarDate) AS CalendarMonth,
       DATEPART(DAY, D.CalendarDate) AS CalendarDay
FROM Dates D;
0 голосов
/ 28 февраля 2020

вы можете попробовать это:

WITH DatesTable AS
(SELECT CAST('19000101' as date) AS [date], year('19000101') [year], MONTH('19000101') [month], DAY('19000101') [day] 
UNION ALL
SELECT DATEADD(dd, 1, [date]), year(DATEADD(dd, 1, [date])) year, MONTH(DATEADD(dd, 1, [date])) month, DAY(DATEADD(dd, 1, [date])) day 
FROM DatesTable
WHERE DATEADD(dd, 1, [date]) <= '20300101'
)
SELECT * into dim.calendar FROM DatesTable
OPTION (MAXRECURSION 0);

19000101 - дата начала
20300101 - дата окончания

...