SQL Server 2008下MYY格式varchar转date类型的优化实现方法
MYY格式日期转DATE类型简洁实现(适配SQL Server 2008兼容级别)
已知MYY格式源字符串的转换规则为:最后两位代表年份,前面1-2位代表月份,统一返回对应月份的1号,示例如下:
| 源字段值 | 转换后目标日期 |
|---|---|
| 905 | 2005-09-01 |
| 122 | 2022-01-01 |
| 1216 | 2016-12-01 |
原有实现存在重复空值判断、日期格式依赖会话配置的隐性问题,以下是适配SQL Server 2008(兼容级别100)的优化方案。
实现代码
推荐写法(查询场景)
在查询中借助CROSS APPLY提前统一处理空值,完全避免重复函数调用,逻辑最简洁:
SELECT -- 其他查询字段..., TRY_CAST( RIGHT(v.clean_field, 2) + RIGHT('0' + LEFT(v.clean_field, LEN(v.clean_field) - 2), 2) + '01' AS DATE) AS converted_date FROM your_source_table t CROSS APPLY (SELECT NULLIF(t.source_field, '') AS clean_field) v
单表达式写法(无需调整查询结构)
如果需要直接在字段位置写表达式,可以用以下写法替换原有逻辑:
TRY_CAST( RIGHT(field, 2) + RIGHT('0' + LEFT(NULLIF(field, ''), LEN(NULLIF(field, '')) - 2), 2) + '01' AS DATE)
注:以上实现沿用SQL Server原生两位年份映射规则(00-49映射为2000-2049,50-99映射为1950-1999),和给出的转换示例完全匹配,无需额外编写年份判断逻辑。
优化说明
- 减少冗余计算:通过
CROSS APPLY提前完成空字符串转NULL的清洗逻辑,无需多次重复调用NULLIF()处理同一字段 - 稳定性更高:采用
YYMMDD格式做日期转换,该格式是SQL Server中不受会话DATEFORMAT、区域语言设置影响的安全格式,不会出现原有斜杠拼接格式在不同服务器配置下解析错位的问题 - 简化补零逻辑:通过给提取到的月份前拼接'0'再取右侧2位的方式,自动适配1位月份(如9月自动补为09)、2位月份(如12月保留12)的场景,无需额外做长度判断
- 空值兼容:源字段为NULL或空字符串时,整个表达式自动返回NULL,不会抛出转换错误,符合空值处理要求
内容的提问来源于stack exchange,提问作者Sky
相关产品推荐
相关产品推荐

