2015-04-21 47 views
2

下面是一个示例数据。查询检查记录是否已经存在超过X小时

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

比方说,这是目前下午2点,我需要查询身份证号码1仅在列DateNow之间的时间差为> = 2小时。

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

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

回答

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

删除where条款,你会得到满足condidion所有ID。

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 
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秒害羞的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分钟前,它不会被看到但是无论时间界限在哪里,都会看到一个两小时和一秒钟前的情况。