Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL Server中插入一天中每小时的记录_Sql_Sql Server - Fatal编程技术网

如何在SQL Server中插入一天中每小时的记录

如何在SQL Server中插入一天中每小时的记录,sql,sql-server,Sql,Sql Server,我正试图为一天中的每一小时插入一条记录 我的桌子结构是按照 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 我现在挣扎

我正试图为一天中的每一小时插入一条记录

我的桌子结构是按照

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....

任何指针都会很受欢迎。

一个巧妙的技巧是使用表
master..spt\u值
(类型
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'
可以很容易地将其转换为
插入

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'
一种方法是使用一个函数来构建时间表。这是一个表,每个要添加的时间段包含一条记录。这种方法允许您避免循环,这不是SQLs的优点之一(按设计)

示例

/* 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
;
-- Pseudocode, will not run.    
INSERT INTO [Target-Table]
    (
        [Column-A],
        ...,
        [DateTime]
FROM
    Calendar
;

为什么不使用SQL作业呢?请看一看,您将其视为一种编程语言。使用连接。相信我。