TSQL显示博客存档

时间:2013-08-02 22:18:54

标签: sql sql-server tsql

我想在我的博客上显示文章的存档(按月份和年份),我无法弄清楚如何编写sql select命令。

我有表Articles并且有PublishDate列(它是日期时间类型),我必须为此表选择唯一的PublishDate,但仅限于月份和年份。

例如,如果我在2013年9月有3个帖子,那么2013年9月将只显示一次。

结果应该是这样的:

September 2013
Novermber 2013
January 2012
etc.

有人可以帮我解决这个TSQL选择命令吗?

3 个答案:

答案 0 :(得分:2)

您可以使用SQL Server日期函数形成所需的日期:

select distinct datename(mm, PublishDate)+' '+cast(year(PublishDate) as varchar(255))
from Articles a

因为您可能希望按日期排序,所以请改用group by

select datename(mm, PublishDate)+' '+cast(year(PublishDate) as varchar(255))
from Articles a
group by datename(mm, PublishDate)+' '+cast(year(PublishDate) as varchar(255))
order by max(PublishDate) desc;

答案 1 :(得分:0)

您可以使用ROW_NUMBER

WITH CTE AS(
    SELECT a.*,
           DATENAME(month, PublishDate) AS MonthPublished, 
           RN = ROW_NUMBER()OVER(PARTITION BY YEAR(PublishDate),MONTH(PublishDate) 
                               ORDER BY  PublishDate ASC)
   FROM dbo.Articles a
)
SELECT * FROM CTE WHERE RN = 1

这仅选择每个年月组的第一个(根据PublishDate)记录。 使用DATENAME(month, PublishDate)获取月份名称。

答案 2 :(得分:0)

根据@GordonLinoff的回答,我提出了这个查询,它返回月份名称以及文章数量和月/年数字:

SELECT DATENAME(mm, PublishDate)+' '+CAST(YEAR(PublishDate) as varchar(255)) AS [monthName], MONTH(PublishDate) AS [month], YEAR(PublishDate) AS [year], COUNT(PublishDate) AS [count]
FROM Articles
WHERE status > 0
GROUP BY DATENAME(mm, PublishDate)+' '+CAST(YEAR(PublishDate) as varchar(255)), MONTH(PublishDate), YEAR(PublishDate)
ORDER BY MAX(PublishDate) DESC;