如何使用substr、instr等函数将点分隔日期值拼接为无分隔符连续字符串
问题原因
你写的SQL出错核心是对SUBSTRING函数的参数规则理解有误:绝大多数SQL方言中,SUBSTRING(字符串, 起始位置, 截取长度)的第三个参数是要截取的字符长度,不是截取的结束位置。你写的substring(date,6,7)是从第6位开始连续截取7个字符,自然会把后续的分隔符、日部分甚至多余内容包含进来,导致拼接结果异常。
实现方案
方案1:固定格式截取(适合固定长度的yyyy.mm.dd格式)
如果存储的日期字符串严格为10位长度、月和日均补零为两位,直接按固定位置截取即可,写法最简单:
SELECT CONCAT( SUBSTRING(date, 1, 4), SUBSTRING(date, 6, 2), SUBSTRING(date, 9, 2) ) AS formatted_date FROM 你的表名;
方案2:动态识别分隔符截取(适配非固定长度场景)
如果存在月、日为单个数字的情况(如2019.1.5),可以用INSTR函数定位点分隔符的位置再截取,兼容性更强:
SELECT CONCAT( -- 截取年:从开头到第一个点之前 SUBSTRING(date, 1, INSTR(date, '.') - 1), -- 截取月:从第一个点之后到第二个点之前 SUBSTRING(date, INSTR(date, '.') + 1, INSTR(date, '.', INSTR(date, '.') + 1) - INSTR(date, '.') - 1), -- 截取日:从第二个点之后到结尾 SUBSTRING(date, INSTR(date, '.', INSTR(date, '.') + 1) + 1) ) AS formatted_date FROM 你的表名;
内容的提问来源于stack exchange,提问作者user10009190
相关产品推荐
相关产品推荐

