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
子句中使用 distinct
和 CONVERT(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
值,则只需将日期时间列转换回Date
在 Order 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
这是我的查询,它没有返回按 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
子句中使用 distinct
和 CONVERT(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
值,则只需将日期时间列转换回Date
在 Order 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