SQL日期转varchar拼接时前导零被忽略的原因是什么
问题根因
date_part()函数返回值为数值类型:例如9月返回数值9、7日返回数值7,直接转换为字符串后结果为'9'、'7',本身不存在前导零,拼接后自然不会有补零效果。- 你当前使用的
substring(cast(date_part('month',er.fecha_procesado) as varchar),0,2)写法存在隐性缺陷:如果月份/日期为两位数(如10月、31日),转换为字符串后为'10'、'31',部分数据库的substring函数起始索引从1开始计数,填写起始位0会导致截取结果不符合预期。
修复方案
最优方案(直接格式化日期,代码更简洁)
你使用的数据库支持日期格式化函数的话,直接调用to_char一步完成日期部分格式化即可,不需要手动拆分年月日拼接:
concat('9635CLR', to_char(er.fecha_procesado, 'YYMMDD'), r.digito_remesa)
格式符说明:
YY表示取年份后两位,MM表示两位数月份(不足自动补前导零),DD表示两位数日期(不足自动补前导零)。
兼容原有拆分逻辑的修改方案
如果需要保留原有拆分逻辑,可使用lpad函数对月、日字符串补前导零到2位:
concat( '9635CLR', substring(cast(date_part('year',er.fecha_procesado) as varchar),3,2), lpad(cast(date_part('month',er.fecha_procesado) as varchar), 2, '0'), lpad(cast(date_part('day',er.fecha_procesado) as varchar), 2, '0'), r.digito_remesa )
lpad(待处理字符串, 目标长度, 填充字符)作用为:如果待处理字符串长度不足目标长度,就从左侧用指定填充字符补全到目标长度,刚好匹配补前导零的需求。
内容的提问来源于stack exchange,提问作者okjfokjrf
相关产品推荐
相关产品推荐

