SQL查询 - 插入多行,每行具有增量日期(+7)其他值相同

时间:2015-03-27 12:41:09

标签: sql sql-server-2008

我需要创建一个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”=具体日期。

任何帮助表示赞赏

2 个答案:

答案 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表。

SQL Fiddle Demo

答案 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