如何将多格式Varchar日期转换为Date类型并更新至表字段?
搞定混合格式日期转Date字段的问题
我来帮你解决这个混合日期格式转换的问题!看你给出的日期示例,主要分两种格式:带短横线的yyyy-MM-dd(比如2019-06-17)和带斜杠的MM/dd/yy(比如01/11/19、11/22/08)。直接用单一的CONVERT或者CAST肯定搞不定,得先判断原字段的格式再分别处理,下面给你几个实用的方案:
方案一:用CASE WHEN区分格式转换(SQL Server适用)
假设你的原字段名叫Date,我们可以通过判断字段里的分隔符来选择对应的转换逻辑:
UPDATE TBL_MULTI_LD_Balance_HIST SET actual_date = CASE -- 处理短横线分隔的yyyy-MM-dd格式,直接转成DATE就行 WHEN [Date] LIKE '%-%' THEN CAST([Date] AS DATE) -- 处理斜杠分隔的MM/dd/yy格式,用样式101(对应MM/dd/yyyy),SQL Server会自动把两位年份转成四位 WHEN [Date] LIKE '%/%' THEN CONVERT(DATE, [Date], 101) -- 遇到无效格式的话,这里设为NULL,你也可以根据自己的需求调整 ELSE NULL END -- 可选:只更新有实际内容的行,避免空值浪费资源 WHERE [Date] IS NOT NULL AND [Date] != '';
小提示:
关于两位年份的转换,SQL Server默认规则是:00-49对应2000-2049,50-99对应1950-1999。如果你的数据里有超出这个范围的两位年份,可能需要额外写逻辑处理哦。
方案二:用TRY_CONVERT避免报错(更安全)
要是你的原字段里可能混着无效的日期字符串(比如abc123这种乱码),直接用CONVERT会导致整个更新中断。这时候用TRY_CONVERT就很省心,它会把转换失败的行返回NULL,不会影响其他正常数据:
UPDATE TBL_MULTI_LD_Balance_HIST SET actual_date = CASE WHEN [Date] LIKE '%-%' THEN TRY_CONVERT(DATE, [Date]) WHEN [Date] LIKE '%/%' THEN TRY_CONVERT(DATE, [Date], 101) ELSE NULL END WHERE [Date] IS NOT NULL AND [Date] != '';
必做:先测试再更新!
在执行更新之前,强烈建议先跑个查询验证转换结果,确保没毛病:
SELECT [Date] AS 原日期, CASE WHEN [Date] LIKE '%-%' THEN TRY_CONVERT(DATE, [Date]) WHEN [Date] LIKE '%/%' THEN TRY_CONVERT(DATE, [Date], 101) ELSE NULL END AS 转换后日期 FROM TBL_MULTI_LD_Balance_HIST WHERE [Date] IS NOT NULL AND [Date] != '';
这样能提前发现转换异常的行,针对性处理,避免更新后出问题~
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

