如何查询指定错误工单发生前后1小时内的所有故障工单?
解决方案:获取特定错误工单前后1小时的所有记录
当然可行!你的需求完全可以实现,问题出在当前代码的关联逻辑上——你用INCIDENT_ID关联临时表和原表,这只会返回临时表里那些错误工单本身,而不是它们时间窗口内的所有工单。
修正后的查询思路
我们可以直接通过时间范围关联来实现:先找出今年以来所有包含目标错误的工单的时间,然后筛选原表中落在这些时间前后1小时内的所有记录。
方法1:使用 EXISTS 子查询
这种方式逻辑清晰,容易理解:
SELECT i.* FROM Incident i WHERE EXISTS ( SELECT 1 FROM Incident t WHERE t.INCIDENT_REPORTED_DATE_TIME > '2018-01-01' AND t.SUMMARY LIKE '%error%' -- 替换成你要匹配的错误关键词,比如'%xyz%' AND i.INCIDENT_REPORTED_DATE_TIME >= DATEADD(HH, -1, t.INCIDENT_REPORTED_DATE_TIME) AND i.INCIDENT_REPORTED_DATE_TIME < DATEADD(HH, 1, t.INCIDENT_REPORTED_DATE_TIME) ) ORDER BY i.INCIDENT_REPORTED_DATE_TIME;
方法2:使用 JOIN 关联时间范围
如果你更习惯用JOIN的写法,也可以这样写(注意加DISTINCT避免重复记录,因为一个工单可能落在多个错误工单的时间窗口内):
SELECT DISTINCT i.* FROM Incident i JOIN Incident t ON i.INCIDENT_REPORTED_DATE_TIME >= DATEADD(HH, -1, t.INCIDENT_REPORTED_DATE_TIME) AND i.INCIDENT_REPORTED_DATE_TIME < DATEADD(HH, 1, t.INCIDENT_REPORTED_DATE_TIME) WHERE t.INCIDENT_REPORTED_DATE_TIME > '2018-01-01' AND t.SUMMARY LIKE '%error%' ORDER BY i.INCIDENT_REPORTED_DATE_TIME;
关键说明
- 把
'%error%'替换成你实际要匹配的错误关键词,比如'%xyz%',确保精准定位目标故障工单。 - 时间条件
> '2018-01-01'可以改成动态写法DATEFROMPARTS(YEAR(GETDATE()), 1, 1),避免硬编码年份,每年自动生效。 - 方法2中的
DISTINCT很重要:如果一个工单同时落在多个错误工单的1小时窗口内,会被多次匹配,去重后才能得到唯一的记录。
这样就能返回今年以来,所有目标错误工单发生前后1小时内的所有故障工单啦!
内容的提问来源于stack exchange,提问作者spamalot78
相关产品推荐
相关产品推荐

