我需要在SQL Server中使用ID
列和TimeValue
列填充表格,01/01/2000
和01/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中生成的其他表“同步”。
如果你能想出更好的方法,我会很想知道!
答案 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 强>