【问题标题】:Order BY SQL Short Date按 SQL 短日期排序
【发布时间】:2020-12-07 08:59:44
【问题描述】:

我想在短期内订购

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 行 从字符串转换日期和/或时间时转换失败。

谁能帮忙

【问题讨论】:

  • 请解释一下:“但它不起作用”。还给我们整个查询,而不仅仅是按部分排序。
  • 当每个数据库系统都内置了 datetime 相关数据类型并且它已经知道如何正确排序时,为什么还要使用字符串?理想情况下,尽可能将其保留在此类类型中,并且仅在向用户显示时将其格式化为文本(同样,尽早解析输入文本 - 大多数应用程序在处理时应该使用日期时间数据类型,而不是字符串日期)
  • 列数据类型?
  • 您使用的是哪个 dbms?日期/时间和字符串函数都是许多 dbms 产品都有自己版本的领域。
  • 它说 Msg 241, Level 16, State 1, Line 80 从字符串转换日期和/或时间时转换失败。

标签: sql sql-server sql-order-by


【解决方案1】:

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

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

Demo

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

【讨论】:

  • Msg 195, Level 15, State 10, Line 85 'LPAD' 不是可识别的内置函数名称。
  • 抱歉,出于某种原因,我认为您使用的是 Oracle(您从未正确标记过您的问题)。如果有帮助,我已经为 SQL Server 编辑了它。
猜你喜欢
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 2012-09-09
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多