我试图在一天中每小时插入一条记录。
我的表结构与
一致DATETIME | VALUE
2016-02-01 00:00:00 | 500
2016-02-01 01:00:00 | 600
假设我想在2016年2月1日的每小时插入一条记录,我的初步方法就是:
WHILE @theTime != '2016-02-02 00:00:00'
...INSERT(blah blah blah)
//increment the @theTime variable
我此刻挣扎的地方是,我不确定如何增加时间。当我使用以下代码时:
declare @theTime datetime = '2016-02-01 00:00:00'
declare @counter int = 1
declare increment cursor FOR SELECT DATEADD(hh, @counter, @theTime);
WHILE @theTime != '2016-02-02 00:00:00'
BEGIN
PRINT @allocTime
SET @counter = @counter + 1
OPEN increment
FETCH NEXT FROM increment INTO @theTime
CLOSE increment;
PRINT @counter
END
我明白了:
Feb 1 2016 12:00AM
2
Feb 1 2016 1:00AM
3
Feb 1 2016 1:00AM
4....
任何指针都会非常感激。
答案 0 :(得分:4)
一个巧妙的技巧是使用表master..spt_values
(类型为P
)作为种子来获取一系列数字,并使用DATEADD
添加0-23小时开始位置:
DECLARE @Start DATETIME = '2016-02-01 00:00:00'
SELECT TOP 24 DATEADD(hour,number,@Start) AS HR
FROM master..spt_values WHERE type='P'
这可以很容易地变成INSERT
DECLARE @Start DATETIME = '2016-02-01 00:00:00'
INSERT INTO MyTable(DateTime,value)
SELECT TOP 24 DATEADD(hour,number,@Start) AS HR, 0
FROM master..spt_values WHERE type='P'
答案 1 :(得分:1)
一种方法是使用recursive CTE来构建时间表。这是一个表,包含您希望添加的每个时间段的1条记录。这种方法允许您避免循环,这不是SQL的优势之一(按设计)。
示例强>
/* Returns one record for each hour between the
* start and end times.
*/
WITH Calendar AS
(
/* CTE using recursion to return a simple
* date table.
*/
-- Anchor Part.
SELECT
@StartTime AS [DateTime]
UNION ALL
-- Recursive part.
SELECT
DATEADD(HOUR, 1, [DateTime]) AS [DateTime]
FROM
Calendar
WHERE
[DateTime] < @EndTime
)
SELECT
[DateTime]
FROM
Calendar
;
现在您拥有了所需的所有记录,您可以从SELECT更改为INSERT语句。
示例强>
-- Pseudocode, will not run.
INSERT INTO [Target-Table]
(
[Column-A],
...,
[DateTime]
FROM
Calendar
;