查询以检查记录是否已存在超过X小时

时间:2015-04-21 06:10:49

标签: sql sql-server sql-server-2005

这是一个示例数据。

ID | Date
---------
1  | 4/21/2015 11:00:00 AM
1  | 4/21/2015 01:00:00 PM

我们现在说下午2点,只有当DateNow列之间的时差为> = 2小时时,我才需要查询ID号1

Select ID from Table where datediff(hour, Date, getdate()) >= 2 and ID = '1'

现在此查询将返回上午11点的第一条记录,但我想忽略其他记录,只检查最新记录是否已存在2小时或更长时间。如果当前时间是下午2点且我的上次记录是下午1点,我应该如何更改查询以便不会得到任何结果。

3 个答案:

答案 0 :(得分:1)

select  id, max(date) as date
from Table
where id = 1
group by id
having datediff(hh, max(date), getdate()) >= 2

删除where子句,您将获得满足条件的所有ID。

答案 1 :(得分:0)

使用MAXGROUP BY获取ID的最新日期,然后检查它是否超过2小时。这样的事情。

SELECT ID,Date
FROM
(Select ID,MAX(Date) Date 
from Table 
GROUP BY ID
)T
where datediff(hour, Date, getdate()) >= 2 and ID = 1

答案 2 :(得分:0)

始终注意从函数返回的确切信息。 DateDiff函数返回两个时间参数之间的单位边界数。例如,小时边界是分钟,秒和小数秒为零时:hh:00:00.000。所以返回的值可能非常误导:

select  DateDiff( hh, '2015-01-01 12:59:59', '2015-01-01 14:00:00' ) as Short,
        DateDiff( hh, '2015-01-01 12:00:00', '2015-01-01 14:59:59' ) as Long

两种情况下的答案都是2小时,但两个日期之间的实际差异在第一种情况下是1小时1秒,在第二种情况下是1小时,差不多是3小时。但是间隔触及相同的两个小时边界,一个在13:00正好,一个在14:00正好。

如果您希望获得两小时内完全的值,请使用DateAdd函数:

select  ID, Max( date ) as Date
from    Table
where   ID = 1
group by ID
having  Max( date) <= DateAdd( hh, -2, GetDate());

现在,如果日期是一小时和59分钟前,它将不会被看到,但无论小时边界在何处,都会看到一小时一秒和一小时之前。