查询上一整小时数据遇ORA-00907错误:括号缺失问题排查
问题排查与解决方案
错误原因
你写的SQL用的是MySQL专属函数,但当前是在Oracle数据库执行,Oracle根本不认识这些函数,才会抛出ORA-00907错误(这个报错提示有时候会误导人,不是真的括号数量不够)。具体问题点:
SUBDATE:Oracle无此函数,日期加减需用INTERVAL语法或对应日期函数STR_TO_DATE、DATE_FORMAT:Oracle日期格式化用TO_DATE、TO_CHAR替代NOW():Oracle获取当前时间用SYSDATE或SYSTIMESTAMP
正确的Oracle写法(获取上一整小时记录)
要实现“无论查询时间,取上一整小时(比如2:05查询就取1:00:00至1:59:59)”的需求,用Oracle的TRUNC函数处理时间最简洁:
WHERE ((SS.NSAMPLE < SS.LSL OR SS.NSAMPLE > SS.USL) OR SS.FAILED = 'Y') AND SD.DIMENSION_ID = SS.DIMENSION_ID -- 上一整小时起始时间 <= 采样时间 < 当前整小时起始时间 AND SS.SAMPLE_DATE >= TRUNC(SYSDATE, 'HH') - INTERVAL '1' HOUR AND SS.SAMPLE_DATE < TRUNC(SYSDATE, 'HH')
逻辑解释
TRUNC(SYSDATE, 'HH'):把当前时间截断到小时维度,比如当前是2:05,结果就是2:00:00TRUNC(SYSDATE, 'HH') - INTERVAL '1' HOUR:得到上一小时的起始时间,也就是1:00:00- 条件
>= 上一小时起始 AND < 当前小时起始刚好覆盖上一整小时的所有记录(包含1:00:00,不包含2:00:00)
如果需要更精确的时间精度(比如微秒),可以用SYSTIMESTAMP替代SYSDATE:
AND SS.SAMPLE_DATE >= TRUNC(SYSTIMESTAMP, 'HH') - INTERVAL '1' HOUR AND SS.SAMPLE_DATE < TRUNC(SYSTIMESTAMP, 'HH')
内容的提问来源于stack exchange,提问作者Robert Malloy
相关产品推荐
相关产品推荐

