2013-08-02 130 views
1

我想显示在我的博客文章归档(按月和年),我不知道如何编写sql select命令。TSQL显示博客档案

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

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

结果应该是这样的:

September 2013 
Novermber 2013 
January 2012 
etc. 

有人可以帮我这个TSQL SELECT命令?

+0

听起来像是你只需要使用[DISTINCT](http://www.w3schools.com/sql/sql_distinct.asp)。 – Mike

回答

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; 
+0

很好,我怎么能得到更多的列像[ArticleName]? – Earlgray

+0

@Earlgray。 。 。您可以使用聚合类似'min(ArticleName)'的查询的第二种形式。 –

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 

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

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;