SQL从文件名提取日期时转换失败,请求解决方案
问题分析与解决
你的问题核心是日期格式代码不匹配,加上多余的嵌套转换操作:
- 从文件名提取的字符串是
01172023,属于MMDDYYYY(月-日-年)格式 - 你使用的格式代码
103对应DD/MM/YYYY(日/月/年),SQL Server会错误地把01当作日期、17当作月份——17超出了月份合法范围(1-12),因此触发转换失败的错误 - 嵌套的
CAST(... AS DATE)再转DATETIME属于冗余操作,完全没必要
正确解法
方法1:拆分重组日期字符串
直接把提取的8位数字拆分为年、月、日,重组为SQL Server默认识别的YYYY-MM-DD格式后转换:
SELECT CONVERT(DATE, RIGHT(substring(FileName, PATINDEX('%[0-9]%', FileName), 8), 4) + '-' + LEFT(substring(FileName, PATINDEX('%[0-9]%', FileName), 8), 2) + '-' + SUBSTRING(substring(FileName, PATINDEX('%[0-9]%', FileName), 8), 3, 2) ) AS ExtractedDate
拆分逻辑:
RIGHT(...,4)取最后4位作为年份:2023LEFT(...,2)取前2位作为月份:01SUBSTRING(...,3,2)取中间2位作为日期:17
方法2:用STUFF添加分隔符后转换
通过STUFF函数给8位数字插入分隔符,转为MM/DD/YYYY格式后用对应代码转换:
SELECT CONVERT(DATE, STUFF(STUFF(substring(FileName, PATINDEX('%[0-9]%', FileName), 8), 3, 0, '/'), 6, 0, '/'), 101 -- 101对应MM/DD/YYYY格式 ) AS ExtractedDate
操作逻辑:
- 第一次
STUFF在第3位插入/,得到01/172023 - 第二次
STUFF在第6位插入/,得到01/17/2023 - 用格式代码
101转换为日期类型,最终结果为2023-01-17
内容的提问来源于stack exchange,提问作者KB Singh
相关产品推荐
相关产品推荐

