按日期时间格式化为 dd.MM.yyyy 的 SQL 顺序不正确

Posted

技术标签:

【中文标题】按日期时间格式化为 dd.MM.yyyy 的 SQL 顺序不正确【英文标题】:SQL order by datetime formatted as dd.MM.yyyy is incorrect 【发布时间】: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 是性能杀手 【参考方案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 很多代码要重命名。但正如我所说,你已经解决了我的问题,谢谢:)

以上是关于按日期时间格式化为 dd.MM.yyyy 的 SQL 顺序不正确的主要内容,如果未能解决你的问题,请参考以下文章

JXDatePicker 使用 SimpleDateFormat 将 dd.MM.yy 格式化为当前世纪的 dd.MM.yyyy

自适应卡片日期格式 dd/MM/yyyy

如何迅速转换日期格式 yyyy-mm-dd转为yyyy/mm/dd

将字符串格式化为日期时间

如何强制输入日期格式为 dd/mm/yyyy? [复制]

使用 JQuery Validate [重复] 以 dd/mm/yyyy 格式验证日期