2013-11-25 167 views
2

我需要用ID列和TimeValue列填充SQL Server中的表,并在01/01/200001/01/2020之间以15分钟的间隔填充。SQL Server:以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中正在生成的其他表“同步”。

如果你能想到一个更好的方法来做到这一点,我会热衷于知道!

+0

由于您无法确定所寻找的时间值是否有价值,我认为SQL不是这里的答案,而编码语言是您解决问题的方法 – nrathaus

回答

4

您可以使用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

可以使用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

1

让我们keept简单,因为总是有换过我们的代码;)

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 
相关问题