首页 > 解决方案 > 按 SQL 短日期排序

问题描述

我想在短期内订购

ShortDate

20-Nov
17-Nov
29-Nov
15-Nov
7-Nov
6-Dec
25-Nov
14-Nov
9-Nov
12-Nov
5-Dec
26-Nov
28-Nov
8-Nov
1-Dec
3-Dec
23-Nov

我用了

ORDER BY CAST(CAST(DATEPART(MONTH,ShortDate) AS VARCHAR(10)) + CAST(RIGHT( '0' + CAST(DAY(ShortDate) AS varchar(2)), 2) AS VARCHAR(10)) AS INT) DESC

整个查询是

SELECT  StaffAttendencecount  ,TC.ShortDate
FROM #TempStaffAttendnece  
INNER JOIN #TempCONStaffAttendnece TC
ON #TempStaffAttendnece.ShortDate = TC.ShortDate
ORDER BY CAST(CAST(DATEPART(MONTH,TC.ShortDate) AS VARCHAR(10)) + CAST(RIGHT( '0' + CAST(DAY(TC.ShortDate) AS varchar(2)), 2) AS VARCHAR(10)) AS INT) DESC

但它不工作我得到

消息 241,级别 16,状态 1,第 80 行从字符串转换日期和/或时间时转换失败。

谁能帮忙

标签: sqlsql-serversql-order-by

解决方案


理想情况下,您不应该将日期存储为文本,或者,如果必须,请尝试使用至少包含年、月和日的 ISO 格式。话虽这么说,你可以在这里形成一个真诚的,然后对它进行排序:

SELECT ShortDate
FROM yourTable
ORDER BY TRY_CONVERT(datetime, ShortDate + '-2020');

下面演示链接的屏幕截图

演示

但是,如上所述,您应该将此查询视为短期修复,直到您有机会修复数据模型并将ShortDate列转换为正确的真实日期或时间戳列。


推荐阅读