Вставлять в таблицу последовательные значения DateTime каждые 5 секунд - PullRequest
0 голосов
/ 12 октября 2018

Допустим, у меня есть такая таблица:

CREATE TABLE table1
(
    CreatedAt   DAteTimeOffset  NULL
);

Как я могу вставить в эту строку 500 строку в цикле while и получать каждую дату каждые 5 секунд?Я хочу, чтобы мой результат был таким:

2018-10-08 05:00:00.0000000 +00:00
2018-10-08 05:00:05.0000000 +00:00
2018-10-08 05:00:10.0000000 +00:00
2018-10-08 05:00:15.0000000 +00:00
2018-10-08 05:00:20.0000000 +00:00
2018-10-08 05:00:25.0000000 +00:00
2018-10-08 05:00:30.0000000 +00:00
2018-10-08 05:00:35.0000000 +00:00
2018-10-08 05:00:40.0000000 +00:00
2018-10-08 05:00:45.0000000 +00:00
2018-10-08 05:00:50.0000000 +00:00
2018-10-08 05:00:55.0000000 +00:00
2018-10-08 05:01:00.0000000 +00:00
2018-10-08 05:01:05.0000000 +00:00
2018-10-08 05:01:10.0000000 +00:00
2018-10-08 05:01:15.0000000 +00:00

и так далее ...

У меня есть цикл while, но я не знаю, как добиться вставки последовательных строк со значениямикаждые 5 сек.

DECLARE
    @i int = 0

WHILE @i < 500
BEGIN
    INSERT INTO table1
    (CreatedAt)
    VALUES
    (?)
END

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Я думаю, что Зохар означает это решение

declare @t table (CreatedAt datetime)

insert into @t 
select top 500 
       dateadd(second, (row_number() over (order by @@spid ) - 1) * 5, sysdatetime()) 
from   sys.objects 
  --cross join sys.objects a cross join sys.objects b 

select * from @t
0 голосов
/ 12 октября 2018

Попробуйте использовать подход, основанный на множестве.Обычно это намного быстрее:

WITH N AS --generate 500 rows (1..500)
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) N
    FROM (VALUES (1),(2),(3),(4),(5)) A(A)
    CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) B(B)
    CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) C(C)
)
INSERT INTO table1 SELECT DATEADD(SECOND, (N-1)*5, SYSDATETIME()) FROM N

Если вам действительно нужен цикл (не рекомендуется), вы можете использовать следующее:

DECLARE @i int = 0;
DECLARE @d DAteTimeOffset = SYSDATETIME();
WHILE @i<500
BEGIN
    INSERT table1 VALUES (@d);
    SET @d = DATEADD(second, 5, @d);
    SET @i += 1;
END
...