Oracle PL/SQL将Mon yyyy格式日期转换为dd-mm-yy格式的方法
解决PL/SQL日期格式转换问题
你当前代码里的TO_DATE(IN_MONTH , 'DD-MM-YYYY')格式掩码完全不匹配输入的August 2022,会直接报错。正确处理分两步:先将输入字符串解析为DATE类型,再转换为目标格式。
具体实现步骤
解析输入字符串
输入格式是「英文月份全称+4位年份」,对应Oracle的日期格式掩码为'FMMonth YYYY':Month:匹配英文月份全称(默认不区分大小写,除非NLS设置强制区分)FM:去除Oracle默认给Month补的多余空格(比如August会被自动补到9字符长度,FM会剔除这些空格)YYYY:匹配4位年份数字
转换为目标格式
目标格式01-08-22是「两位日-两位月-两位年」,用TO_CHAR函数搭配格式掩码'DD-MM-RR':DD:自动取当月第一天(因为输入无日期信息)并格式化为两位数字MM:将月份转换为两位数字RR:将4位年份转为两位,自动识别世纪(22对应2022)
修改后的代码示例
PROCEDURE CHECK_DUMMY ( IN_SL_NO IN SIGN.SL_NO%TYPE, IN_MONTH IN SIGN.MONTH%TYPE ) AS V_MON_DATE DATE; V_TARGET_FORMAT VARCHAR2(10); BEGIN -- 解析"August 2022"为DATE类型 V_MON_DATE := TO_DATE(IN_MONTH, 'FMMonth YYYY'); -- 转换为"01-08-22"格式 V_TARGET_FORMAT := TO_CHAR(V_MON_DATE, 'DD-MM-RR'); -- 此处可添加后续业务逻辑 DBMS_OUTPUT.PUT_LINE('转换后日期:' || V_TARGET_FORMAT); END CHECK_DUMMY;
额外注意
如果数据库的NLS_DATE_LANGUAGE不是英文,需要在解析时指定语言,避免月份识别失败:
V_MON_DATE := TO_DATE(IN_MONTH, 'FMMonth YYYY', 'NLS_DATE_LANGUAGE = AMERICAN');
内容的提问来源于stack exchange,提问作者Mohsina
相关产品推荐
相关产品推荐

