如何在datetime转char后按原日期排序?解决DISTINCT排序报错
问题:带DISTINCT的日期格式化后按原datetime列排序报错
我有一个datetime类型的列,想要把日期以dd/mm/yyyy格式展示,执行了下面的SQL语句:
Select distinct CONVERT(VARCHAR(10), [DateAndTime], 103) as [DateAndTime] from dbo.Prod order by dbo.Prod.[DateAndTime]
结果报错:
ORDER BY items must appear in the select list if SELECT DISTINCT is specified
去掉ORDER BY子句后,得到的结果是无序的:
DateAndTime 03/03/2023 16/02/2023 17/02/2023 21/02/2023
解决办法
用GROUP BY替代DISTINCT
GROUP BY不需要将排序字段加入SELECT列表,先按原datetime列分组(自动完成日期去重),再格式化输出并排序:
SELECT CONVERT(VARCHAR(10), [DateAndTime], 103) AS [DateAndTime] FROM dbo.Prod GROUP BY [DateAndTime] ORDER BY [DateAndTime]
用子查询/CTE先去重再排序
先通过子查询获取去重后的原日期和格式化日期,外层只取格式化后的日期并按原日期排序:
WITH DistinctDates AS ( SELECT DISTINCT [DateAndTime], CONVERT(VARCHAR(10), [DateAndTime], 103) AS [FormattedDate] FROM dbo.Prod ) SELECT [FormattedDate] AS [DateAndTime] FROM DistinctDates ORDER BY [DateAndTime]
错误原因说明
使用DISTINCT时,ORDER BY的字段必须存在于SELECT列表中。原语句里排序用的是原datetime列,但它不在SELECT列表里,因此触发报错。上面两种方法都能避开这个限制,同时保证结果按原datetime的日期顺序排列。
内容的提问来源于stack exchange,提问作者dNaver
相关产品推荐
相关产品推荐

