我正在编写一个用于显示月份和年份的存储过程。它正在工作,但它没有按所需顺序返回行。
ALTER procedure [dbo].[audioblog_getarchivedates]
as
begin
select DateName(Month,a.createddate) + ' ' + DateName(Year,a.createddate) as ArchiveDate
from audio_blog a
group by DateName(Month,a.createddate) + ' ' + DateName(Year,a.createddate)
order by DateName(Month,a.createddate) + ' ' + DateName(Year,a.createddate) desc
end
结果会是这样的:
2010年3月
2010年1月
2010年2月
但这不是订单(desc)。
答案 0 :(得分:4)
杰夫史密斯写了excellent article关于如何按年 - 月对进行分组和排序的方法。我特别喜欢他将日期四舍五入到该月的第一天并按该值进行分组的方法:
GROUP BY dateadd(month, datediff(month, 0, SomeDate),0)
它更快,因为它不需要字符串连接。
您可以稍后在查询中将此值转换为年 - 月组合,方法是在其上执行YEAR
和MONTH
以获得用户友好的表示。
答案 1 :(得分:2)
您希望按日期时间值排序,但您的群组没有。一种方法是在每个组中任意选择一个创建日期(例如MAX),然后按这些方式选择:
select ArchiveDate from (
select DateName(Month,a.createddate) + ' ' + DateName(Year,a.createddate) as ArchiveDate, MAX(createddate) as createddate
from (select CONVERT(datetime,createddate) as createddate from (select '20100101' as createddate union all select '20100201' union all select '20100301') t) a
group by DateName(Month,a.createddate) + ' ' + DateName(Year,a.createddate) ) g
order by g.createddate desc
答案 2 :(得分:1)
我用子查询解决了这类问题。内部查询同时具有DisplyName和SortIndex。 外部查询显示名称,但对索引进行排序。
e.g
select a,b,c DisplayName from
(select a, b,c, DisplayName, SortIndex....
) as Temp
order by Temp.SortIndex
只需添加显示/索引对
,即可将此常规方法用于任意数量的字段答案 3 :(得分:0)
结束时:
order by a.createddate desc
答案 4 :(得分:0)
不是最好的解决方案,但在您弄明白之前应该有效。
ALTER PROCEDURE [dbo].[Audioblog_getarchivedates]
AS
BEGIN
SELECT DISTINCT Datename(MONTH,a.DATE) + ' ' + Datename(YEAR,a.DATE) AS archivedate,
Cast(Datename(MONTH,a.DATE) + ' ' + Datename(YEAR,a.DATE) AS DATETIME) AS tmp
FROM audio_blog a
ORDER BY tmp DESC
END
答案 5 :(得分:-2)
按1(desc)排序