检索自上次记录以来的秒数

Retrieving seconds since last record

我以为这很简单,但我有一个问题。

SELECT DATEDIFF (s,getdate(), max(TimeCreated)) as difference
FROM Ens.MessageHeader

我的期望是这会显示当前时间和最近记录的时间戳之间的差异。如果我执行它,我会得到类似 e 15057 的东西,这可能是正确的。但是,下次我执行它时,它会更低。没有任何新记录。现在它在 15024。仍然没有新的记录。目前最新的时间戳是 2016-05-13 08:51:16

我的想法是我可以观察这个计数器,当它重置为零时我知道有一条新消息。

我错过了什么?

更新 我在查询中添加了一些额外的数据以帮助查看发生了什么:

SELECT getDate() as now, max(TimeCreated) as latest, DATEDIFF (s,getdate(), max(TimeCreated)) as difference
FROM Ens.MessageHeader

这里有几个结果集:

now                  latest               difference  
-------------------  -------------------  ----------  
2016-05-13 09:50:45  2016-05-13 08:51:16  14431       
2016-05-13 09:52:29  2016-05-13 08:51:16  14327       
2016-05-13 09:52:50  2016-05-13 08:51:16  14306       

这很好奇。发生的事情是 TimeCreated 在 "future" 中。 DATEDIFF(x, <exp1>, <exp2>) 计算 <exp2> - <exp1>.

的差值

所以,如果TimeCreate应该是过去的,那么你可以试试:

SELECT DATEDIFF(second, max(TimeCreated), getdate())
FROM Ens.MessageHeader;

然后您会得到一个负数并想知道发生了什么。随着秒数的流逝,负数趋近于零,因为当前 date/time 越来越接近 max(TimeCreated).

我猜你遇到了时区问题。或者,您有一些影响 TimeCreated 的偏见。您可能想要 review other ways 获取当前 date/time 值。

这里的陷阱与您调用 DATEDIFF() 时参数的顺序有关,而且 TimeCreated 是一个 UTC 时间戳,在某些情况下会转换为本地时间,但是看起来它在 DATEDIFF 内部时没有被转换。因此,您编写的查询看起来正在返回 MAX(TimeCreated + UTC_offset) - getdate(),这是一个越来越小的正数。

正如@Gordon Linoff 的回答所述,您应该将 MAX(TimeCreated) 作为 DATEDIFF 的第二个参数,因为那是 diff 的开始时间。您还可能希望将其包装在 %EXTERNAL 函数中,以 110% 确保它在 运行 比较之前被转换为本地时间:

SELECT DATEDIFF(second, %EXTERNAL(MAX(TimeCreated)), getdate())
FROM Ens.MessageHeader

上面的查询给了我预期的结果,因为我们在同一时区以正确的顺序比较两个时间!

综上所述,我不确定 DATEDIFF() 获取转换前值的行为是有意为之还是错误。