SQL对mm-yyyy格式nvarchar字段按日期排序时try_convert返回null问题求解
问题原因
直接使用TRY_CONVERT(datetime, monthyear)返回NULL是因为:
- 你存储的
monthyear为MM-YYYY格式,缺少具体的日信息,SQL Server默认的日期转换规则无法识别这种缺省日的字符串格式 - 默认的日期字符串解析顺序不符合「月份在前、年份在后」的格式要求
解决方法
两种常用方案都可以实现你需要的排序效果:
方案1:补全日信息后转换为日期
给字符串拼接固定的日(比如01),再指定格式码110(对应MM-DD-YYYY格式)做转换,即可得到正确的日期值:
With TempTable AS ( select monthyear, try_convert(datetime, '01-' + monthyear, 110) as SomeDate from table1 ) Select monthyear from TempTable ORDER BY SomeDate DESC
这里排序用
DESC是因为你的期望结果是2021年的日期在前、2020年的在后,按日期倒序排列刚好匹配要求。
方案2:拆分字符串按年、月分别排序
不需要做日期转换,直接拆分出年份和月份部分排序,性能更优:
select monthyear from table1 ORDER BY RIGHT(monthyear,4) DESC, -- 优先按年份倒序 LEFT(monthyear,2) DESC -- 同年份再按月份倒序
内容的提问来源于stack exchange,提问作者user13570703
相关产品推荐
相关产品推荐

