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

Query to check if record has existed for more than X hours

这是一个示例数据。

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'

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

使用 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
select  id, max(date) as date
from Table
where id = 1
group by id
having datediff(hh, max(date), getdate()) >= 2

去掉where子句,你会得到所有满足条件的id。

始终准确了解函数返回的信息。 DateDiff 函数 returns 两个时间参数之间的单位边界数。例如,小时边界是分钟、秒和小数秒为零时: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 小时,但两个日期之间的实际差异在第一种情况下是一小时零一秒,而在第二种情况下是三小时差一秒。但是间隔触及相同的两个小时边界,一个恰好在 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());

现在,如果一个日期是 1 小时 59 分钟前,则不会看到它,但会看到 2 小时 1 秒前的日期,无论小时边界在哪里。