【问题标题】:SQL order by datetime formatted as dd.MM.yyyy is incorrect按日期时间格式化为 dd.MM.yyyy 的 SQL 顺序不正确
【发布时间】:2022-01-08 19:54:13
【问题描述】:

我在按正确顺序排序数据时遇到问题。 我尝试了几种不同的组合,但它们都以错误的方式返回数据。 日期列采用datetime 格式。 我尝试过的一些代码:

SELECT CONVERT(VARCHAR(10), recievedDate, 104) as day
FROM table
GROUP BY CONVERT(VARCHAR(10), recievedDate, 104)
ORDER BY CONVERT(VARCHAR(10), recievedDate, 104)

返回数据为:

01.02.2021
01.03.2021
01.04.2021
02.02.2021
02.03.2021
...

我试过了:

SELECT FORMAT(CONVERT(DATETIME, CONVERT(VARCHAR(10), recievedDate, 121)),'dd.MM.yyyy')
FROM table
GROUP BY FORMAT(CONVERT(DATETIME, CONVERT(VARCHAR(10), recievedDate, 121)),'dd.MM.yyyy')
ORDER BY FORMAT(CONVERT(DATETIME, CONVERT(VARCHAR(10), recievedDate, 121)),'dd.MM.yyyy')

返回相同的结果。

但我想要的是:

01.01.2021
02.01.2021
03.01.2021
01.02.2021

等等。我真的不知道为什么它将所有月份分组然后按天排序。

【问题讨论】:

  • 如果[date](你真的应该重命名)是date/datetime数据类型,你为什么不按它排序呢? ORDER BY [date]
  • 我以 MM-dd-yyyy HH:mm:ssss 日期时间格式接收它,所以我将其转换
  • datetime 没有格式,您在屏幕上看到的是基于本地设置的表示。无论如何,如果要对日期进行排序,请确保它是正确的数据类型。
  • 是的,但我正在使用 API,所以我需要它按照设置的方式工作......不是我自己的本地设置
  • 另外,FORMAT 是性能杀手

标签: sql tsql datetime sql-order-by


【解决方案1】:

通过转换为datedatetime 进行分组,并在分组之后 格式化日期:

SELECT CONVERT(VARCHAR(10), CONVERT(date, recievedDate), 104)
FROM t
GROUP BY CONVERT(date, recievedDate)
ORDER BY CONVERT(date, recievedDate)

【讨论】:

  • 为方便起见,我重命名了该列...但此代码返回:Column 'recievedDate' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
  • 您肯定打错字或更改了选择部分的表达式。我在 group by 中使用CONVERT(date, recievedDate),然后格式化完全相同的表达式。
  • 哦,是的,我做到了,我的错......它现在可以工作了,谢谢你的帮助:D
  • 您到底在用 group by 做什么?在您的代码中,您似乎想要合并特定日期的所有记录,例如2021-12-02 01:002021-12-02 23:00 合二为一。
  • 嗯,是的,我有更多数据,但我不想显示它们/2 很多代码要重命名。但正如我所说,你已经解决了我的问题,谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多