按日期时间格式化为 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】:
通过转换为date
对datetime
进行分组,并在分组之后 格式化日期:
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:00
和 2021-12-02 23:00
合二为一。
嗯,是的,我有更多数据,但我不想显示它们/2 很多代码要重命名。但正如我所说,你已经解决了我的问题,谢谢:)以上是关于按日期时间格式化为 dd.MM.yyyy 的 SQL 顺序不正确的主要内容,如果未能解决你的问题,请参考以下文章
JXDatePicker 使用 SimpleDateFormat 将 dd.MM.yy 格式化为当前世纪的 dd.MM.yyyy