【问题标题】:GetDate() is returning the same time at various points in a procedureGetDate() 在过程中的不同点返回相同的时间
【发布时间】:2016-06-30 00:31:00
【问题描述】:

我不确定我在这里缺少什么,但是当我在 SQL Server 2008 SSMS 会话中执行类似操作时:

declare @start datetime
declare @end datetime

set @start = GetDate()

Update blah blah...a huge amount of rows...;

set @end = GetDate()

当我尝试在 @start@end 之间执行 datediff 秒时,我得到零。

所以我打印了@start@end,它们是相同的。查询花了几分钟时间。这是怎么回事?

编辑——问题在于 Set @start 和 Set @end 在游标打开/关闭块内(但不在 fetch 循环内),显然 MS 将它们视为完全相同的时间。

谢谢, 吉姆

【问题讨论】:

  • 您比较开始和结束的过程部分是什么样的?
  • 同时添加打印代码。例如,如果您使用 raiserror nowait 立即回显打印,事情可能会变得更清晰。
  • 我只是在程序结束时打印,用 108 格式代码(只是时间部分)格式化它们。 nowait 应该没有实际意义——我不在乎 何时 打印它,我已经在变量中捕获了“当前”时间,所以没有什么应该改变这些变量的值。我现在不在我的工作机器上,所以我无法得到确切的代码,但我只是想我在某个地方错过了一些基本规则。
  • 我认为您可能会打印两次相同的日期并执行相同日期的 datediff,而不是使用您声明的两个日期。
  • 我相信标准 SQL 要求它看起来好像过程立即执行,因此当前时间在过程执行时被冻结。当然,一些 DBMS 以这种方式解释规则,即使过程中有 SLEEP 60。

标签: sql-server sql-server-2008 datetime


【解决方案1】:

在您的四个具体用例中,您可能会发现 Datetime2 和 SYSDATETIME() 会为您提供更高的精度。然后,您可以使用纳秒 datediff 运算符。

顺便说一句,您应该假设 UPDATE myDate = GETDATE() WHERE "lots of records" 和 UPDATE myDatefield = SYSDATETIME() 在更新过程中总是会给您提供与您预期不同的日期值,具体取决于月相和芝加哥熊队上一场比赛的比分。

这是因为 GETDATE() 在 SQL Server 内部的两个不同级别上不是确定性的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 2020-06-14
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    相关资源
    最近更新 更多