在 SQL Server 中,按日期排序,不按 desc 顺序显示所有日期



我必须在一个电子商务门户的管理面板中按日期降序显示每日收集的金额。但是当我尝试显示它时,它会显示每日收集的数量,但随机显示。

Dates       Amount
------------------
30/12/2017  36010   
30/11/2017  42780   
29/12/2017  23090   
29/11/2017  66060   
28/12/2017   4700   
28/11/2017  84370 

但我必须按以下顺序显示这一点

Dates       Amount
--------------------
30/12/2017  36010
29/12/2017  23090
28/12/2017   4700       
30/11/2017  42780   
29/11/2017  66060   
28/11/2017  84370

这是我的示例代码,请纠正我,我错的地方

SELECT
    (SUM(MonthAmount) + SUM(LateFine)) AS DailyCollection, 
    CONVERT(VARCHAR(11), ApprovedDate, 103) AS InboxDate  
FROM
    [dbo].[SlipDetails] 
WHERE
    ApprovedByAdmin = 'A' 
GROUP BY 
    CONVERT(VARCHAR(11), ApprovedDate, 103) 
ORDER BY 
    InboxDate DESC

使用....Order by ApprovedDate desc

您正在对字符串/文本值而不是日期值进行排序(因为在排序之前将ApprovedDate转换为字符串(

如果您希望日期字段采用该指定格式,则可以使用以下方法。 即,您可以将该格式化的日期字符串转换为Date数据类型,仅用于排序。

select (sum(MonthAmount) + sum(LateFine)) as DailyCollection, 
CONVERT(varchar(11),ApprovedDate,103) as InboxDate  
from [dbo].[SlipDetails] where ApprovedByAdmin='A' 
group by CONVERT(varchar(11),ApprovedDate,103) 
order by CONVERT(DATE,  CONVERT(varchar(11),ApprovedDate,103),103) desc

注意 :- 如@Larnu所述,最好保持数据类型不变,并更改表示层中的显示格式。

这里的问题是您将date转换为varchar,然后对其进行排序。varchar的顺序与date的顺序非常不同。例如,在日期方面,16/01/201801/12/2020之前。然而,从varchar方面来说,01/12/202016/01/2018之前。为什么?因为01之前.

保持数据类型不变,并担心表示层中的显示格式。

像下面这样做:

select DailyCollection, InboxDate from (
    select (sum(MonthAmount) + sum(LateFine)) as DailyCollection, 
    CONVERT(varchar(11),ApprovedDate,103) as InboxDate  
    from [dbo].[SlipDetails] where ApprovedByAdmin='A' 
    group by CONVERT(varchar(11),ApprovedDate,103)
) as T order by convert(datetime, InboxDate, 103) desc

当您将datetime列转换为 varchar 时,如果您使用转换后的varchar列进行排序,您将不会得到所需的结果,在这种情况下,您可以使用派生表并将varchar列转换回datetime,同时像我上面所做的那样执行顺序。

似乎正在根据 varchar 数据类型执行排序。您需要根据日期数据类型对记录进行排序。

select (sum(MonthAmount) + sum(LateFine)) as DailyCollection, 
CONVERT(varchar(11),ApprovedDate,103) as InboxDate  
from [dbo].[SlipDetails] where ApprovedByAdmin='A' 
group by CONVERT(varchar(11),ApprovedDate,103) 
order by CONVERT(DATE,  CONVERT(varchar(11),ApprovedDate,103),103) desc