【问题标题】:SQL Query to Insert All Minutes in 24hour format in a table以 24 小时格式在表中插入所有分钟的 SQL 查询
【发布时间】:2016-08-28 04:49:42
【问题描述】:

我的数据库中有一个 Minutes 表,我想将所有 24 小时格式的分钟(从 00:00 开始)插入到该表中。我可以使用以下查询来做到这一点,但我希望找到一个更快的查询来代替我想出的这个非常基本的查询。

DECLARE @Start as Time(0) = CAST('00:00' as time)
DECLARE @ctr int = 0;
WHILE @ctr<>1440
BEGIN
INSERT INTO Minutes(Minute) VALUES(@Start)
SET @Start = DATEADD(minute, 1, @Start)
SET @ctr = @ctr + 1
END

上述查询有时会导致脚本超时。

【问题讨论】:

  • 如果您只需要执行一次,为什么还需要更快的东西?但是,请看here
  • @TimSchmelter 我理解你的观点,但我有一个复杂的原因,我宁愿不详细说明问题的根源。 (这会使一个简单的问题复杂化)。让我们假设我需要一个更快的查询,因为黑魔王看到我低效的 sql 技能会生气。

标签: sql-server


【解决方案1】:

您可以通过 Excel 生成以下字段:

传递给 A1:INSERT INTO Minutes(Minute) VALUES(

传递给 B1:1

传递给 C1 )

选择所有 3 列(A1;B1;C1)并左键单击 C1 的左下角并将其向下拖动至 1440 行。它将生成以下行:

INSERT INTO Minutes(Minute) VALUES(1)
INSERT INTO Minutes(Minute) VALUES(2)
INSERT INTO Minutes(Minute) VALUES(3)
.....

这样就够快了。

更新

要使用单个查询,您可以尝试以下操作:

【讨论】:

  • 我需要一个 sql 查询,但这很聪明,谢谢。 +1
  • @super-user in SQL-Server 你可以插入逗号分隔的值,用相同的方法更新我的答案,但是单个查询。编码愉快!
【解决方案2】:

试试这个,使用recursive CTE

DECLARE @Start as Time(0) = CAST('00:00' as time)
;WITH CTE_TIME AS (
    SELECT  @Start STIME
    UNION ALL
    SELECT  DATEADD(MINUTE,1,STIME) 
    FROM CTE_TIME
    WHERE   DATEDIFF(MINUTE,@Start,STIME) < 1439
)
SELECT * FROM CTE_TIME
OPTION (MAXRECURSION 0)

【讨论】:

  • 虽然下面的 Prdp 的答案是第一个要发布的答案,但我选择了这个答案,因为它以相同的毫秒执行,但查询更短。黑魔王会大吃一惊
  • @super-user - 这会在您增加范围时产生影响
  • @super-user - 这是一篇性能比较出色的文章sqlperformance.com/2013/01/t-sql-queries/generate-a-set-1
【解决方案3】:

这里是使用Tally table基于SET 的方法 方法,它不需要任何循环递归

DECLARE @Start as Time(0) = CAST('00:00' as time)

;WITH e1(n) AS
(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
), -- 10
e2(n) AS (SELECT 1 FROM e1 CROSS JOIN e1 AS b), -- 10*10
e3(n) AS (SELECT 1 FROM e1 CROSS JOIN e2), -- 10*100
e4(n) AS (SELECT 1 FROM e1 CROSS JOIN e3), 
tally (n) as ( SELECT n = ROW_NUMBER() OVER (ORDER BY n) FROM e4 )
SELECT Dateadd(minute, n - 1, @Start)
FROM   tally
WHERE  n <= 1440 

【讨论】:

  • 哇,这在 10 毫秒内完成了这项工作,我原来的查询需要超过 1 分钟才能执行。这就是我所说的高效 sql 查询。黑暗领主现在会很高兴。非常感谢朋友。
  • @super-user - 很高兴它帮助了你
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2022-01-04
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多