SQL Server中将yyyymmdd或yyyyddmm格式转为dd MMM yyyy的方法
SQL Server 日期文本格式转换实现方案
1. 任意8位日期文本(yyyymmdd/yyyyddmm)转dd MMM yyyy
实现逻辑:先判断输入的8位文本格式类型,通过截取第5-6位判断是否大于12,大于12则为yyyyddmm格式,否则为yyyymmdd格式,拼接为合法的yyyymmdd格式后转日期类型,再格式化输出。
实现代码:
DECLARE @InputDateStr CHAR(8) = '20213112' -- 也可替换为'20211231'测试 SELECT FORMAT( CASE -- 中间两位大于12,说明是日期而非月份,属于yyyyddmm格式 WHEN CAST(SUBSTRING(@InputDateStr, 5, 2) AS INT) > 12 THEN CONVERT(DATE, CONCAT(LEFT(@InputDateStr,4), RIGHT(@InputDateStr,2), SUBSTRING(@InputDateStr,5,2)), 112) ELSE CONVERT(DATE, @InputDateStr, 112) END, 'dd MMM yyyy', 'en-US' -- 指定英文区域保证月份为英文缩写 ) AS ConvertedDate
以上代码对输入20211231和20213112均会输出31 Dec 2021,符合需求。
2. 表列存储格式切换后的转换方案
2.1 列当前为yyyymmdd格式存储
直接调用转换函数即可,性能最优:
-- 替换YourTable、DateStr为实际表名和列名 SELECT FORMAT(CONVERT(DATE, DateStr, 112), 'dd MMM yyyy', 'en-US') AS FormattedDate FROM YourTable
2.2 列改为yyyyddmm格式存储
固定拆分拼接逻辑,无需动态判断,性能更高:
-- 替换YourTable、DateStr为实际表名和列名 SELECT FORMAT( CONVERT(DATE, CONCAT(LEFT(DateStr,4), RIGHT(DateStr,2), SUBSTRING(DateStr,5,2)), 112), 'dd MMM yyyy', 'en-US' ) AS FormattedDate FROM YourTable
注意事项
如果使用SQL Server 2008R2及更低版本,不支持FORMAT函数,可使用CONVERT配合格式码106实现相同效果:
-- 低版本yyyyddmm列转换示例,字符串拼接可替换为+号适配更低版本 SELECT CONVERT(VARCHAR, CONVERT(DATE, LEFT(DateStr,4)+RIGHT(DateStr,2)+SUBSTRING(DateStr,5,2), 112), 106) AS FormattedDate FROM YourTable
格式码106的原生输出格式就是dd mon yyyy,和需求完全匹配,只需保证实例的默认语言为英文即可输出英文月份缩写。
内容的提问来源于stack exchange,提问作者Md. Tarikul Islam Soikot
相关产品推荐
相关产品推荐

