我需要创建一个INSERT
查询,以便除1之外的所有列都相同,但不是一列的日期是一周增加到选定日期的日期。
E.g:
Row UserID Date Out In Reason Details
---------------------------------------------------------------------
1 12 2015-04-01 9 5 Other Flexible Hours
2 12 2015-04-08 9 5 Other Flexible Hours
3 12 2015-04-15 9 5 Other Flexible Hours
4 12 2015-04-22 9 5 Other Flexible Hours
5 12 2015-04-29 9 5 Other Flexible Hours
6 12 2015-05-06 9 5 Other Flexible Hours
7 12 2015-05-13 9 5 Other Flexible Hours
8 12 2015-05-20 9 5 Other Flexible Hours
所以我在想像
这样的东西INSERT INTO Holidays(UserId, Date , Out, In, Reason, Details)
VALUES ('12', (DATEADD(DAY, +7, GETDATE()), '9', '5', 'Other', 'Flexible Hours') ;
但由于我对SQL很新,我不知道这是否有效,而且我不知道如何重复这个,直到“date”=具体日期。
任何帮助表示赞赏
答案 0 :(得分:2)
您可以使用递归CTE
:
DECLARE @from DATE = '2015-04-01'
DECLARE @to DATE = '2015-05-20'
;WITH CTE AS (
SELECT @from AS [Date]
UNION ALL
SELECT DATEADD(d, 7, [Date]) AS [Date]
FROM CTE
WHERE DATEADD(d, 7, [Date]) <= @to
)
INSERT INTO Holidays(UserId, [Date] , [Out], [In], Reason, Details)
SELECT '12', [Date], '9', '5', 'Other', 'Flexible Hours'
FROM CTE
上面使用的递归CTE
创建了以下临时结果集:
Date
----------
2015-04-01
2015-04-08
2015-04-15
2015-04-22
2015-04-29
2015-05-06
2015-05-13
2015-05-20
然后使用Holidays
语句将这组结果插入INSERT INTO SELECT
表。
答案 1 :(得分:1)
我更喜欢基于row_number()和一些包含某些行的表生成这样的日期系列(和其他值)。在这种情况下,我使用sys.all_objects。 我发现这种方法可以生成非常快速清晰且易于读取的代码。
row_number将生成1及以上的数字列表。然后使用该数字计算新日期(7 * N)天+ startDate。
DECLARE @fromDate DATE = '2015-04-01';
DECLARE @toDate DATE = '2015-05-20';
WITH dates AS (
SELECT dateadd(day, 7 * rn, @fromDate) AS [Date] FROM
(
SELECT row_number() over (ORDER BY (SELECT null)) AS rn
FROM sys.all_objects
) rns
)
INSERT INTO Holidays(UserId, [Date] , [Out], [In], Reason, Details)
SELECT '12', [Date], '9', '5', 'Other', 'Flexible Hours'
FROM dates
WHERE [Date] < @toDate;
有许多方法可以生成序列,有些在一系列精彩文章中详细讨论过:http://sqlperformance.com/2013/01/t-sql-queries/generate-a-set-1