【问题标题】:Insert into table consecutive DateTime values every 5 secounds每 5 秒将连续的 DateTime 值插入表中
【发布时间】:2019-03-17 10:13:27
【问题描述】:

假设我有一张这样的桌子:

CREATE TABLE table1
(
    CreatedAt   DAteTimeOffset  NULL
);

如何在while 循环中插入该表的第 500 行并每 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 sek 插入具有值的连续行。

DECLARE
    @i int = 0

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

【问题讨论】:

  • 这是使用"tally table"的绝佳候选者
  • select datetimefromparts(2018, 10, 12, 10, 22, 5, 0) 并用变量替换数字。但是使用计数表确实会更好

标签: sql-server tsql datetime while-loop datetimeoffset


【解决方案1】:

尝试使用基于集合的方法。它通常更快:

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

【讨论】:

  • 这是一个很好的答案。附带说明:您可以简单地执行select top 500 row_number() over (order by @@spid) from sys.objects 而不是指定所有这些值(如果是小型数据库,请添加交叉连接:sys.objects a cross join sys.objects b
  • sys.objects,没问题,但是对于一个小数据集,这将需要 IO 到磁盘(以获取对象列表),其中(虚拟)计数表可以完全在内存中完成.
【解决方案2】:

我认为 Zohar 意味着这个解决方案

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

【讨论】:

    猜你喜欢
    • 2011-11-03
    • 2016-02-08
    • 1970-01-01
    • 2021-07-13
    • 2015-09-16
    • 1970-01-01
    • 2020-12-07
    • 2023-03-16
    • 2018-08-05
    相关资源
    最近更新 更多