如何在SQL Server中对nvarchar类型时间值进行降序排序
在SQL Server中对nvarchar类型的时间值排序的解决方案
遇到这种把日期和时间存在单独nvarchar字段的情况,直接排序肯定会踩坑——因为字符串排序是按字符逐个比较的,比如你示例里的12:43 PM会比11:04 AM先被当成“更大”的字符串,但实际时间上后者更早。要解决这个问题,核心思路是把字符串格式的日期时间转换成真正的datetime类型,再进行排序。
具体实现方法
基础排序(升序/降序)
假设你的日期格式是dd-MM-yyyy(比如05-03-2018代表2018年3月5日),可以用CONVERT函数把拼接后的日期时间字符串转成datetime类型,再排序:
-- 按时间升序排序(和你的示例输出一致) SELECT AtrxId, AtrxDate, AtrxTime, AtrxDes FROM YourTableName ORDER BY CONVERT(DATETIME, AtrxDate + ' ' + AtrxTime, 105) ASC;
如果需要降序排序,只需要把ASC改成DESC:
-- 按时间降序排序 SELECT AtrxId, AtrxDate, AtrxTime, AtrxDes FROM YourTableName ORDER BY CONVERT(DATETIME, AtrxDate + ' ' + AtrxTime, 105) DESC;
这里的105是SQL Server的日期样式参数,对应dd-MM-yyyy格式,刚好匹配你的AtrxDate格式。
处理格式不规范的数据
如果你的数据里存在格式错误的日期/时间字符串,直接用CONVERT会导致查询报错。这种情况下可以用TRY_CONVERT(SQL Server 2012及以上版本支持),它会把转换失败的行返回NULL,不会中断整个查询:
SELECT AtrxId, AtrxDate, AtrxTime, AtrxDes FROM YourTableName ORDER BY TRY_CONVERT(DATETIME, AtrxDate + ' ' + AtrxTime, 105) ASC;
长期优化建议
从性能和数据规范性角度来说,强烈建议把AtrxDate和AtrxTime字段改成datetime或datetime2类型:
- 避免每次排序都要做字符串转换,提升查询效率
- 防止出现格式错误的无效数据
- 支持更多原生的日期时间运算(比如计算时间差、增减天数等)
内容的提问来源于stack exchange,提问作者lasantha herath
相关产品推荐
相关产品推荐

