SQL Server:以15分钟为间隔填充表

时间:2013-11-25 10:36:22

标签: sql-server datetime intervals populate

我需要在SQL Server中使用ID列和TimeValue列填充表格,01/01/200001/01/2020之间的间隔为15分钟。

似乎必须有一个简单的方法来实现它,但我是T-SQL的新手,并且找不到任何简单的方法来实现这一点。

ID         Timevalue           
------------------------------
      0    01/01/2000 00:00:00
      1    01/01/2000 00:15:00
      2    01/01/2000 00:30:00
   ...      ...                
 701280    01/01/2020 00:00:00

如果您感兴趣,此表用于连接带有时间戳和值的表 - 连接表可能/可能没有某些间隔的空白但如果出现多个值之间不应进行任何分组/平均01:00-01:15它应该只在01:00和01:15报告值。需要有固定数量的输出行,以便它与在Excel中生成的其他表“同步”。

如果你能想出更好的方法,我会很想知道!

3 个答案:

答案 0 :(得分:5)

您可以使用numbers table

WITH Numbers AS
(
    SELECT TOP (10000) n = CONVERT(INT, ROW_NUMBER() OVER (ORDER BY s1.[object_id]))
    FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2
)
SELECT id = ROW_NUMBER() OVER (ORDER BY n), [timestamp] = DATEADD(MINUTE, n, '00:00:00')
FROM Numbers
WHERE n % 15 = 0

答案 1 :(得分:2)

让我们保持简单,因为总有另一个看着我们的代码;)

DECLARE @start DATETIME, @end DATETIME  

SET @start = '20000101';
SET @end = '20000105';    --SET @end = '20200101';

WHILE @start < @end
BEGIN
  INSERT INTO Table1
  VALUES (@start)

  SET @start = DATEADD(MINUTE, 15, @start)
END

答案 2 :(得分:1)

您可以使用Recursive CTE创建时间间隔:

CREATE TABLE Table1 (ID INT IDENTITY(0,1), TIMEVALUE DATETIME);

DECLARE @start DATETIME;
DECLARE @end DATETIME;

SET @start = '20000101';
SET @end = '20200101';

WITH CTE_DT AS 
(
    SELECT @start AS DT
    UNION ALL
    SELECT DATEADD(MINUTE,15,DT) FROM CTE_DT
    WHERE DT< @end
)
INSERT INTO Table1
SELECT DT FROM CTE_DT
OPTION (MAXRECURSION 0);

<强> SQLFiddle DEMO