SQL select 查询按 DESC 返回错误的顺序

SQL select query returning wrong order by DESC

这是我的查询,它没有返回按 RegistrationDate Desc:

排序的正确结果
SELECT
    Team,
    CONVERT(VARCHAR(10), RegistrationDate, 103) AS RegistrationDate,
    FormFilledAt, CreationBy 
FROM
    Table_Candidate_Info 
WHERE
    Status = 'Completed'  
GROUP BY
    Team, CONVERT(VARCHAR(10), RegistrationDate, 103), FormFilledAt, CreationBy 
ORDER BY 
    RegistrationDate DESC

如果我要使用此查询,它会按 RegistrationDate Desc

返回正确的顺序
select * 
from Table_Candidate_Info 
order by RegistrationDate desc

我想上面的第一个查询应该是 RegistrationDate order by Desc 和 group by query

尝试

order by CONVERT(VARCHAR(10),RegistrationDate,103) desc

如果你真的想按日期(而不是文本)保持顺序,或者更好,试试这个:

select Team, CONVERT(VARCHAR(10),RegistrationDate,103) as RegistrationDate, FormFilledAt,CreationBy  
from (
        Select Team, cast(RegistrationDate as date) as RegistrationDate ,FormFilledAt,CreationBy 
        from Table_Candidate_Info 
        where Status='Completed'  
        group by Team,cast(RegistrationDate as date)  ,FormFilledAt,CreationBy
) tmp 
order by RegistrationDate desc

注意:如果你想按日期 + 时间分组,删除 cast…as date

order by 子句中使用 distinctCONVERT(VARCHAR(10),RegistrationDate,103)

Select distinct Team,CONVERT(VARCHAR(10),RegistrationDate,103)as RegistrationDate ,FormFilledAt,CreationBy 
from Table_Candidate_Info where Status='Completed'  
order by CONVERT(VARCHAR(10),RegistrationDate,103) desc

注意:您不需要分组依据,因为您没有使用任何聚合函数

Select 子句中将其转换为 varchar 时,结果未按 RegistrationDate 排序的原因是因为 Order By 子句是 Select 子句的求值 之后进行逻辑处理。 现在在您写

时的第一个查询中
Select * from Table_Candidate_Info order by RegistrationDate desc

[尽管在 select 列表中写入 * 是一种非常糟糕的做法] RegistrationDate 的格式仍然保留在 Select 子句中的日期,这适用于 Order By 子句的进一步逻辑处理阶段.因此 31.01.2019 在前,31.12.2018 在后。

但是当您将其转换为 varchar(10) 以获得所需的格式时,实际上 Order By 子句排序的是 Varchar 而不是 Date。因此 31/12/2018 在前,31/01/2019 在其后。

要解决此问题,如果您想在 Select 中保留 datetime/date 列的格式,但 Order By 具有 Date 值,则只需将日期时间列转换回DateOrder by 子句中。

伪代码为:

select CONVERT(VARCHAR(10),RegistrationDate,103) as RegistrationDate from 
Table_Candidate_Info 
order by cast(RegistrationDate as Date) desc -- cast it back to date

演示 Link 此处:https://rextester.com/WMLQL78387