查询以检查记录是否存在超过 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 点,只有当列 Date
和 Now
之间的时间差 >= 2 小时时,我才需要查询 ID 号 1。
Select ID from Table where datediff(hour, Date, getdate()) >= 2 and ID = '1'
现在这个查询将 return 上午 11 点的第一条记录,但我想忽略其他记录,只检查最新记录是否已存在 2 小时或更长时间。如果当前时间是下午 2 点,而我的最后一条记录是下午 1 点,我应该如何更改我的查询,以便我不会得到任何结果。
使用 MAX
和 GROUP 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 秒前的日期,无论小时边界在哪里。
这是一个示例数据。
ID | Date
---------
1 | 4/21/2015 11:00:00 AM
1 | 4/21/2015 01:00:00 PM
假设现在是下午 2 点,只有当列 Date
和 Now
之间的时间差 >= 2 小时时,我才需要查询 ID 号 1。
Select ID from Table where datediff(hour, Date, getdate()) >= 2 and ID = '1'
现在这个查询将 return 上午 11 点的第一条记录,但我想忽略其他记录,只检查最新记录是否已存在 2 小时或更长时间。如果当前时间是下午 2 点,而我的最后一条记录是下午 1 点,我应该如何更改我的查询,以便我不会得到任何结果。
使用 MAX
和 GROUP 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 秒前的日期,无论小时边界在哪里。