Oracle数字格式日期转日期并提取月份报错‘Not a valid month’求助
解决SQL提取月份时的"Not a valid month"错误
咱们先拆解下你遇到的问题:你的RPT_DT是数字类型(比如20180131这种yyyymmdd格式的数字),但你写的SQL绕了不必要的弯路,还因为日期格式不匹配导致了报错。
错误原因分析
你内层查询把RPT_DT转成了'mm/dd/yyyy'格式的字符串(比如'01/31/2018'),然后外层直接用to_date(Rpt_dt)时,没有指定对应格式。数据库会用默认的日期格式(比如常见的DD-MON-RR)去解析这个字符串,这时候它会把01当成日,31当成月份——显然31不是合法月份,所以就抛出了"Not a valid month"的错误。
正确的解法(两种常用方式)
1. 直接提取数字中的月份(最快,不需要转日期)
因为RPT_DT是yyyymmdd格式的数字,我们可以把它转成字符串后,截取第5到第6位(对应月份部分):
SELECT DISTINCT SUBSTR(TO_CHAR(RPT_DT), 5, 2) AS month_mm FROM TABLE_NAME;
如果想要英文月份名称,直接把数字转成日期后格式化即可:
SELECT DISTINCT TO_CHAR(TO_DATE(RPT_DT, 'YYYYMMDD'), 'MONTH') AS month_name FROM TABLE_NAME;
(注:MONTH会返回全拼月份,比如JANUARY;如果要缩写可以用MON,比如JAN)
2. 使用EXTRACT提取月份(符合你最初的需求)
如果一定要用EXTRACT,不需要多一层转换,直接把数字转成日期后提取:
SELECT DISTINCT EXTRACT(MONTH FROM TO_DATE(RPT_DT, 'YYYYMMDD')) AS month_num FROM TABLE_NAME;
内容的提问来源于stack exchange,提问作者Tpk43
相关产品推荐
相关产品推荐

