You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL从文件名提取日期时转换失败,请求解决方案

问题分析与解决

你的问题核心是日期格式代码不匹配,加上多余的嵌套转换操作:

  1. 从文件名提取的字符串是01172023,属于MMDDYYYY(月-日-年)格式
  2. 你使用的格式代码103对应DD/MM/YYYY(日/月/年),SQL Server会错误地把01当作日期、17当作月份——17超出了月份合法范围(1-12),因此触发转换失败的错误
  3. 嵌套的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位作为年份:2023
  • LEFT(...,2) 取前2位作为月份:01
  • SUBSTRING(...,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:07:31