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