Oracle SQL使用DATE_FORMAT按月分组报ORA-00904错误如何解决
错误原因
你遇到的error 00904. 00000 - invalid identifier报错,是因为编写SQL时误用了MySQL数据库的专属函数DATE_FORMAT(),Oracle数据库没有这个内置函数,无法识别该函数名,因此抛出无效标识符错误。
修复方法
Oracle中做日期格式化需要使用内置的TO_CHAR()函数,替换掉原SQL里的DATE_FORMAT()即可实现按月统计去重事故数的需求,修正后的SQL如下:
SELECT TO_CHAR(DATUM, 'YYYY/MM') AS "Month", COUNT(DISTINCT ID_ACCIDENT) AS "Počet nehod" FROM RAW_DATA GROUP BY TO_CHAR(DATUM, 'YYYY/MM');
补充说明
- 如果
DATUM列是字符串类型、固定存储为YYYY/MM/DD格式,也可以直接用字符串截取的方式分组,执行效率更高:
SELECT SUBSTR(DATUM, 1, 7) AS "Month", COUNT(DISTINCT ID_ACCIDENT) AS "Počet nehod" FROM RAW_DATA GROUP BY SUBSTR(DATUM, 1, 7);
- 低版本Oracle不支持在
GROUP BY子句中直接引用SELECT里定义的别名,因此分组时要写完整的格式化/截取表达式,不要直接写别名,避免触发新的报错。 - 如果需要输出带月份名称的结果,可以把格式化参数里的
MM替换为MON(月份缩写)或MONTH(月份全称)。
内容的提问来源于stack exchange,提问作者Filip Kotas
相关产品推荐
相关产品推荐

