我必须在一个电子商务门户的管理面板中按日期降序显示每日收集的金额。但是当我尝试显示它时,它会显示每日收集的数量,但随机显示。
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/2018
在01/12/2020
之前。然而,从varchar
方面来说,01/12/2020
在16/01/2018
之前。为什么?因为0
在1
之前.
保持数据类型不变,并担心表示层中的显示格式。
像下面这样做:
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