ORA-00936缺失表达式错误:Ruby执行Oracle设备统计查询报错排查
问题定位
你的SQL报错核心原因是使用了Oracle不支持的date()函数,Oracle语法中没有内置的date()函数来提取时间字段的日期部分,SQL解析器无法识别该函数调用,因此抛出ORA-00936: missing expression错误。
修复方法
你当前的需求是提取request_time的日期部分(剔除时分秒),在Oracle中对应的标准函数是TRUNC(),你需要做两处修改:
- 将SELECT子句中的
date(request_time) AS date_request_time替换为TRUNC(request_time) AS date_request_time - 将GROUP BY子句中的
date(request_time)同步替换为TRUNC(request_time)
修改后的完整SQL如下:
SELECT COUNT(*) AS count_all, TRUNC(request_time) AS date_request_time, "REQUESTS"."DEVICE_ID" AS requests_device_id FROM "REQUESTS" WHERE customer_id = 1 AND request_method != 'OPTIONS' AND device_id IS NOT NULL AND request_time BETWEEN '2021-10-27 00:00:00' AND '2021-11-03 23:59:59.000999' GROUP BY TRUNC(request_time), "REQUESTS"."DEVICE_ID"
额外优化说明:原WHERE条件中
request_time的范围判断重复写了两次,上述修改已将冗余条件合并,不影响逻辑的同时提升执行效率。
如果你的SQL是通过Ruby的ActiveRecord自动生成的,需要确认你使用的Oracle适配器配置正确,避免后续自动生成的语句再次误用date()函数。
内容的提问来源于stack exchange,提问作者Pro_grammer
相关产品推荐
相关产品推荐

