【问题标题】:tsql while loop and time issuetsql while循环和时间问题
【发布时间】:2017-02-02 16:16:17
【问题描述】:

我不知道我的查询出了什么问题,但它没有跳出 while 循环。我认为这是我计算时间的方式,但不确定。

DECLARE @start DATETIME = GETDATE(), @currenttime INT = 0

while @currenttime <= 1 --- represent min
begin

    [execute Query]

    ' this will always return 0 and keep executing query even though the 1 min has been reached
    set @currenttime = CONVERT(INT, DATEDIFF(s, @start, GETDATE())%3600/60) 
end

【问题讨论】:

  • 看起来while循环将执行2分钟。检查是在@currenttime 小于或等于 1 时进行的。
  • s 表示日期差异中的第二个 - 只需使用 set @currenttime = DTEDIFF(s, @start, GETDATE())
  • @Hogan,所以这会检查第二个?如果是这样,我需要它几分钟。
  • @Hogan,哇。你对你的评论是认真的吗?你没看我的帖子吗,我说我的计算可能不对。我当然知道使用“mi”。我只是想确保我得到正确的信息。我想无论你走到哪里,周围都是混蛋。

标签: sql sql-server tsql


【解决方案1】:

另一种方法是改变while循环的条件:

SELECT @Start = GETDATE()

WHILE DATEDIFF(SECOND, @Start, GETDATE()) < 3 -- Execute the loop for 3 seconds
BEGIN

SELECT 1

END

【讨论】:

  • 我认为这是一个更容易理解的模板。
  • @Hogan 我,这就是我写它的原因。当您不必在代码中的其他位置查找构成条件的值时,它的可读性会更高。
  • 这是在一段时间内运行循环的可靠方法吗?当我在本地 SQL 2016 Express 实例上执行此操作时,它会运行 12 到 15 秒...
  • 我和你在一起@3N1GM4
  • 我没有对它进行广泛的测试,只有一次,所以我不知道。时间当然取决于循环的内容。
【解决方案2】:

而是尝试计算结束时间并循环直到到达

DECLARE @EndTime DATETIME
SET @EndTime = DATEADD(SECOND, 5, GETDATE())

WHILE GETDATE() < @EndTime
BEGIN

    PRINT CAST(DATEDIFF(SECOND, GETDATE(), @EndTime) AS VARCHAR(5)) + ' Seconds Remaining' 

END

【讨论】:

  • 这给了我一个预期秒数的可靠运行时间,不像Zohar Peled's answer。 +1
  • @3N1GM4 - 从功能上讲,这并没有连接到数据库,另一个答案是 - 所以也许你的网络不好/速度慢?
  • @Hogan 似乎不太可能,因为我连接到的 SQL 实例在我的物理机本地。无论如何,如果答案中的建议可能会因网络带宽和/或延迟而有所不同,我建议这会影响该解决方案的实用性,因此我的评论。
  • @3N1GM4 -- 他们不做同样的事情 -- 一个是选择语句,一个是打印。把打印放在第一个,会发生什么?
  • 无论哪种情况,您都将调用 GETDATE()。两个答案中的循环内容只是一个示例,在实际实现中将是相同的
【解决方案3】:

根据this answer 的类似问题,如果您想每秒运行一次脚本,持续 60 秒,例如:

DECLARE @i INT = 1;

WHILE (@i <= 60)
 BEGIN
  WAITFOR DELAY '00:00:01'

       /*Your Script*/

 SET  @i = @i + 1;
END 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 2013-05-09
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2014-11-22
    • 1970-01-01
    相关资源
    最近更新 更多