T-SQL日期格式转换:将'01-Sep-2017'转为'01/09/2017'及存储方案
方案选择建议
长远来看,直接用UPDATE语句统一数据格式(最好是转换成日期类型,而非统一字符串格式)是更优的选择,原因如下:
- 查询时每次转换会额外消耗数据库计算资源,数据量越大,性能影响越明显;
- 统一存储为日期类型(比如
datetime2)能彻底避免格式混乱问题,还能直接支持日期范围查询、排序等操作,后续开发维护更省心; - 如果一直保留两种字符串格式,后续新增功能或修改查询逻辑时很容易踩格式兼容的坑。
如果只是临时查询需求,偶尔处理一次,那查询时转换也可以,但不推荐长期这么做。
T-SQL转换实现方法
1. UPDATE统一数据格式(推荐)
方式一:统一为'01/09/2017'字符串格式
执行前一定要先测试转换结果,确认无误后再执行UPDATE:
-- 先测试转换结果,验证正确性 SELECT 原日期值 = YourColumnName, 转换后日期值 = FORMAT(CONVERT(date, YourColumnName, 106), 'dd/MM/yyyy') FROM YourTableName WHERE YourColumnName LIKE '%-%' -- 筛选带连字符的目标数据 -- 确认正确后执行更新 UPDATE YourTableName SET YourColumnName = FORMAT(CONVERT(date, YourColumnName, 106), 'dd/MM/yyyy') WHERE YourColumnName LIKE '%-%'
说明:
CONVERT(date, YourColumnName, 106)用于将'dd-Mon-yyyy'格式的字符串转为date类型(106对应英国/法国日期格式);FORMAT(..., 'dd/MM/yyyy')则将日期类型转为斜杠分隔的字符串格式。
方式二:直接转换为日期类型(更推荐)
如果业务允许,把列类型改成日期类型是彻底解决问题的方法:
-- 1. 添加临时日期列 ALTER TABLE YourTableName ADD TempDate date -- 2. 将两种格式的字符串统一转为日期类型存入临时列 UPDATE YourTableName SET TempDate = CASE WHEN YourColumnName LIKE '%-%' THEN CONVERT(date, YourColumnName, 106) ELSE CONVERT(date, YourColumnName, 103) -- 103对应dd/MM/yyyy格式 END -- 3. 验证数据无误后,替换原列 ALTER TABLE YourTableName DROP COLUMN YourColumnName EXEC sp_rename 'YourTableName.TempDate', 'YourColumnName', 'COLUMN'
提示:操作前务必备份数据,避免意外丢失!
2. 查询时临时转换(临时需求用)
如果只是临时查询需要统一格式,不想修改原数据,可以用以下语句:
SELECT 原日期值 = YourColumnName, 标准化日期 = CASE WHEN YourColumnName LIKE '%-%' THEN FORMAT(CONVERT(date, YourColumnName, 106), 'dd/MM/yyyy') ELSE YourColumnName END FROM YourTableName
如果需要直接获取日期类型数据:
SELECT 原日期值 = YourColumnName, 日期类型值 = CASE WHEN YourColumnName LIKE '%-%' THEN CONVERT(date, YourColumnName, 106) ELSE CONVERT(date, YourColumnName, 103) END FROM YourTableName
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

