SQL Server: заполнять таблицу через 15-минутные интервалы

Мне нужно заполнить таблицу в SQL Server столбцом ID и TimeValue с 15-минутными интервалами между 01/01/2000 и 01/01/2020.

Кажется, что это должен быть простой способ сделать это, но я новичок в 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 ответа

Таблицу чисел можно использовать

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


пусть он просто прост, так как всегда есть другой, смотрящий наш код;)

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


Вы можете создавать временные интервалы с помощью рекурсивного 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

licensed under cc by-sa 3.0 with attribution.