【问题标题】:SQL Insert new years into the calendarSQL 在日历中插入新年
【发布时间】:2020-06-12 14:45:06
【问题描述】:

我对 SQL 完全陌生,但仍然有人要求我提供帮助,因为没有其他人可以这样做。

在发现的其他内容中,我无法理解如何在 SQL Server 数据库的日历表中添加额外的年份。

该表设置了 8 年,从 2013 年 1 月开始,到今年 12 月结束。在这个日期到来之前是否可以延长?

我想出的唯一语法是:

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

但我很确定应该有另一种最快的方法,即循环一年内的日期参数。

感谢您的帮助

【问题讨论】:

    标签: sql sql-server date calendar sqldatatypes


    【解决方案1】:

    生成此类数据的最快方法是使用 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;
    

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      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 是结束日期

      【讨论】:

      • 然而,这不太可能比WHILE 快得多,如果有的话。这会遇到同样的 RBAR 问题。 Speed Test: rCTE vs Tally
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多