【发布时间】: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