SQL Server排序MM/DD/YYYY格式varchar日期月日混淆如何解决
问题根因
排序异常本质上是字符串字典序排序和日期时间逻辑排序的差异导致的:
- 你将
ARRIVAL_DATE_TIME字段存储为varchar类型,排序时会按字符逐位比较:10/xx/2021的首字符1比09/xx/2021的首字符0ASCII码更小,所以10月的记录会排在9月之前。 - 你之前写的SQL语句存在逻辑错误:
convert(varchar, [ARRIVAL_DATE_TIME], 9)是将原本就是varchar类型的字段再次转换为varchar,格式码9不会生效,最终排序还是基于原始字符串的字典序,没有达到按时间排序的效果。
解决方案
方案1:长期最优方案,调整表结构和SSIS导入配置
直接将ARRIVAL_DATE_TIME字段的类型修改为DATETIME,从存储层面避免后续转换问题:
- 调整SSIS导入逻辑:在平面文件源组件的「高级编辑器」中,将
ARRIVAL_DATE_TIME字段的输出数据类型设置为DT_DBTIMESTAMP,匹配格式MM/dd/yyyy hh:mm:ss.fff tt,导入时直接完成字符串到日期类型的转换,存入SQL Server。 - 后续查询直接按字段排序即可,不需要额外转换:
SELECT [ARRIVAL_DATE_TIME] FROM [MAKS].[dbo].[Masks] ORDER BY [ARRIVAL_DATE_TIME]
方案2:不改表结构,临时查询时转换后排序
如果暂时无法调整表结构,查询时先将varchar类型的字段转换为DATETIME类型,再基于转换后的结果排序:
SELECT [ARRIVAL_DATE_TIME] FROM [MAKS].[dbo].[Masks] -- 109格式码正好匹配你存储的12小时制带毫秒的日期格式,TRY_CONVERT可避免脏数据导致查询报错 ORDER BY TRY_CONVERT(DATETIME, [ARRIVAL_DATE_TIME], 109)
内容的提问来源于stack exchange,提问作者Amenay Khial
相关产品推荐
相关产品推荐

