Oracle SQL调用GET_MONTH函数查询无数据问题求助
问题原因及解决方案:函数查询无结果的根源分析
嘿,我来帮你理清楚这个问题的核心——其实是两个小细节搞砸了你的查询,尤其是第二个,很容易被忽略:
1. 函数里多余的日期转换(次要,但需要修正)
你的函数参数tgl已经是DATE类型了,可你却又做了to_date(tgl, 'DD/MM/YYYY HH24:MI:SS')这个操作。这会让Oracle先把DATE类型的tgl隐式转换成字符串(用当前会话的日期格式),再重新转成DATE,完全是画蛇添足,甚至可能在某些会话设置下触发转换错误。
2. 最关键的:Month格式返回的字符串带尾随空格!
这才是查询无结果的真正原因:当你用TO_CHAR(..., 'Month')时,Oracle返回的月份字符串是固定长度的(比如英文环境下,最长的月份是SEPTEMBER,9个字符),不足的部分会用空格补齐。比如2月的FEBRUARY是8个字符,所以函数返回的其实是'FEBRUARY '(后面带1个空格),而你表A里的MNTH字段存储的是不带空格的'FEBRUARY',两者自然不相等,查不到数据。
你可以自己验证一下:执行这个语句看长度差异:
SELECT LENGTH(GET_MONTH('12/02/2017 12:12:12')) AS func_length, LENGTH('FEBRUARY') AS str_length FROM dual;
结果肯定是func_length比str_length大,因为多了尾随空格。
修正方案
方案1:从函数根源解决(推荐)
修改函数,用FMMonth格式掩码(FM会去掉尾随空格),同时删掉多余的to_date转换:
create or replace FUNCTION GET_MONTH(tgl DATE) RETURN VARCHAR2 IS mnth VARCHAR2(20); BEGIN mnth := TO_CHAR(tgl, 'FMMonth'); RETURN UPPER(mnth); END; /
这样函数返回的就是不带空格的大写月份字符串,和表A的MNTH字段完全匹配。
方案2:临时查询时处理(不推荐,治标不治本)
如果暂时不想修改函数,可以在查询时用TRIM去掉函数返回值的空格:
SELECT cost FROM A WHERE mnth = TRIM(GET_MONTH('12/02/2017 12:12:12'));
至于为什么直接写WHERE mnth = 'FEBRUARY'能查到?因为你表A里的MNTH字段存的就是无空格的字符串,直接匹配自然成功啦。
内容的提问来源于stack exchange,提问作者Hilfit19
相关产品推荐
相关产品推荐

