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
我的期望是,这将显示当前时间和最近记录的时间戳之间的差异。如果我执行它,我会得到像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
在“未来”
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()
行为是故意的还是错误的。

当我在自己的表上执行具有日期值的相同代码时,返回的秒数为负数。