Sql 正在检索自上次记录以来的秒数
我以为这很简单,但我有个问题Sql 正在检索自上次记录以来的秒数,sql,datediff,intersystems-cache,Sql,Datediff,Intersystems Cache,我以为这很简单,但我有个问题 SELECT DATEDIFF (s,getdate(), max(TimeCreated)) as difference FROM Ens.MessageHeader 我的期望是,这将显示当前时间和最近记录的时间戳之间的差异。如果我执行它,我会得到像e15057这样的东西,这可能是正确的。但是,下次我执行它时,它会更低。没有任何新记录。现在它位于15024。仍然没有新的记录。最近的时间戳当前为2016-05-13 08:51:16 我的想法是,我可以观察这个计数
SELECT DATEDIFF (s,getdate(), max(TimeCreated)) as difference
FROM Ens.MessageHeader
我的期望是,这将显示当前时间和最近记录的时间戳之间的差异。如果我执行它,我会得到像e15057
这样的东西,这可能是正确的。但是,下次我执行它时,它会更低。没有任何新记录。现在它位于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
在“未来”DATEDIFF(x,)
计算-
的差值
因此,如果TimeCreate
应该是过去的,那么您可以尝试:
SELECT DATEDIFF(second, max(TimeCreated), getdate())
FROM Ens.MessageHeader;
然后你会得到一个负数,并想知道发生了什么。随着时间的流逝,负数逐渐变为零,因为当前日期/时间越来越接近max(TimeCreated)
我猜你有时区问题。或者,您有一些影响
TimeCreated
的偏见。您可能希望了解获取当前日期/时间值的方法。这里的问题与对DATEDIFF()
的调用中参数的顺序有关,TimeCreated
是UTC时间戳,在某些情况下转换为本地时间,但在DATEDIFF
内部时,它似乎没有被转换。因此,您编写的查询看起来返回的是MAX(TimeCreated+UTC\u offset)-getdate()
,这是一个越来越小的正数
正如@Gordon Linoff的回答所述,您应该将MAX(TimeCreated)
作为DATEDIFF
的第二个参数,因为这是差异的开始时间。您可能还希望将其包装在%EXTERNAL
函数中,以确保在运行比较之前110%将其转换为本地时间:
SELECT DATEDIFF(second, %EXTERNAL(MAX(TimeCreated)), getdate())
FROM Ens.MessageHeader
上面的查询给出了我期望的结果,因为我们正在以正确的顺序在同一时区比较这两次
尽管如此,我不确定获取转换前值的
DATEDIFF()
行为是故意的还是错误的。当我在自己的表上执行具有日期值的相同代码时,返回的秒数为负数。