检索自上次记录以来的秒数
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()
获取转换前值的行为是有意为之还是错误。
我以为这很简单,但我有一个问题。
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()
获取转换前值的行为是有意为之还是错误。