Oracle SQL如何筛选所属月份含31天的日期 解决ORA-00932报错
报错核心原因
LAST_DAY() 是Oracle日期处理内置函数,入参要求为DATE类型,返回值为对应月份最后一天的DATE类型,两次写法均存在数据类型不匹配问题:
- 第一种写法将
LAST_DAY()返回的DATE类型值直接与数字31比较,类型不匹配触发报错 - 第二种写法中
EXTRACT(DAY FROM HIREDATE)返回的是数字类型(对应日期为当月的第几天),将数字传入要求DATE入参的LAST_DAY(),也会触发类型不匹配错误。
正确实现方案
方案1:提取当月最后一天的天数判断
直接对LAST_DAY()返回的当月最后一天日期,提取「日」部分和31比较,逻辑直观易读:
SELECT ENAME, HIREDATE FROM scott.emp WHERE EXTRACT(DAY FROM LAST_DAY(HIREDATE)) = 31;
也可以用TO_CHAR实现相同逻辑:
SELECT ENAME, HIREDATE FROM scott.emp WHERE TO_CHAR(LAST_DAY(HIREDATE), 'DD') = '31';
方案2:直接判断月份(性能更优)
一年中固定只有1、3、5、7、8、10、12月有31天,不需要计算当月最后一天,直接判断月份即可,大表查询时执行效率更高:
SELECT ENAME, HIREDATE FROM scott.emp WHERE EXTRACT(MONTH FROM HIREDATE) IN (1,3,5,7,8,10,12);
内容的提问来源于stack exchange,提问作者Linked List
相关产品推荐
相关产品推荐

