我认为这很简单,但我有一个问题。
SELECT DATEDIFF (s,getdate(), max(TimeCreated)) as difference
FROM Ens.MessageHeader
我的期望是,这将显示当前时间与最近记录的时间戳之间的差异。如果我执行它,我会得到一些可能正确的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
答案 0 :(得分:4)
这里的问题与你对DATEDIFF()
的调用中的参数顺序有关,以及TimeCreated
是在某些情况下转换为本地时间的UTC时间戳的事实,但它看起来很像就像在DATEDIFF
内部时没有被转换一样。所以你写的查询看起来好像正在返回MAX(TimeCreated + UTC_offset) - getdate()
,这是一个越来越小的正数。
正如@Gordon Linoff的回答所述,你应该MAX(TimeCreated)
作为DATEDIFF
的第二个参数,因为这是差异的开始时间。您也可能希望将其包含在%EXTERNAL
函数中,以确保在运行比较之前将其转换为本地时间:
SELECT DATEDIFF(second, %EXTERNAL(MAX(TimeCreated)), getdate())
FROM Ens.MessageHeader
以上查询为我提供了我期望的结果,因为我们正在按照正确的顺序和同一时区进行两次比较!
所有这一切,我不确定关于采用预转换值的DATEDIFF()
行为是否有意或是错误。
答案 1 :(得分:0)
这很奇怪。发生的事情是TimeCreated
处于“未来”。 DATEDIFF(x, <exp1>, <exp2>)
计算<exp2> - <exp1>
的差异。
所以,如果TimeCreate
应该在过去,那么你可以尝试:
SELECT DATEDIFF(second, max(TimeCreated), getdate())
FROM Ens.MessageHeader;
然后你会得到一个负数,并想知道发生了什么。随着秒数的增加,负数会趋于零,因为当前日期/时间越来越接近max(TimeCreated)
。
我的猜测是你有时区问题。或者,您有一些影响TimeCreated
的偏见。您可能需要review other ways获取当前日期/时间值。