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

时间:2016-05-13 14:41:52

标签: sql datediff intersystems-cache

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

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       

2 个答案:

答案 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获取当前日期/时间值。