Oracle PL/SQL拼接日期时间字符串转换异常问题排查
问题原因与解决方法
错误核心在于日期格式掩码与输入字符串的格式不匹配:
- 你拼接后的输入字符串是连续的8位字符(比如
2302011523),没有空格分隔日期和时间部分 - 但使用的格式掩码是
YYMMDD HH24MI,其中包含空格,这会让Oracle的TO_DATE函数解析时出现歧义
当分钟数≤23时,Oracle会错误拆分字符串:把前4位2302当作YY(年份),接下来两位01当作MM(月份),再接下来两位15当作DD(日期),最后两位23当作HH24(小时),分钟部分因无法匹配被默认填充为0,所以得到错误结果2302-01-15 23:00。而分钟数≥24时(比如29),由于小时最大为23,Oracle无法把29当作小时,才会按预期拆分:前6位230201对应YYMMDD,中间两位15对应HH24,最后两位29对应MI。
修正后的语句
方法1:去掉格式掩码里的空格
让格式与输入的连续字符串完全匹配:
SELECT TO_CHAR(TO_DATE('230201'||''||'1523', 'YYMMDDHH24MI'), 'YYYY-MM-DD HH24:MI') FROM DUAL;
执行后返回正确结果2023-02-01 15:23。
方法2:拼接时加入空格
让输入字符串与原格式掩码匹配:
SELECT TO_CHAR(TO_DATE('230201'||' '||'1523', 'YYMMDD HH24MI'), 'YYYY-MM-DD HH24:MI') FROM DUAL;
同样能得到正确结果。
内容的提问来源于stack exchange,提问作者Gayan Chinthaka Dharmarathna
相关产品推荐
相关产品推荐

