SQL 在日历中插入新年

Posted

技术标签:

【中文标题】SQL 在日历中插入新年【英文标题】:SQL Insert new years into the calendar 【发布时间】: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 ...)

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

感谢您的帮助

【问题讨论】:

【参考方案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

以上是关于SQL 在日历中插入新年的主要内容,如果未能解决你的问题,请参考以下文章

excel表格日历控件怎么添加

在EXCEL中插入日历控件后,如何添加到单元格上(带下拉箭头),点击后出现日历,选择一个日期自动填充并隐

EXCEL怎么设置日历控件,且运用与一行或几列(注:是在单元格中下拉可选择)

怎样在excel表格中 插入日历 达到可选日期的效果

如何在wps表格中插入日历表

使用服务帐户插入 Google 日历条目