我想在我的博客上显示文章的存档(按月份和年份),我无法弄清楚如何编写sql select命令。
我有表Articles
并且有PublishDate
列(它是日期时间类型),我必须为此表选择唯一的PublishDate
,但仅限于月份和年份。
例如,如果我在2013年9月有3个帖子,那么2013年9月将只显示一次。
结果应该是这样的:
September 2013
Novermber 2013
January 2012
etc.
有人可以帮我解决这个TSQL选择命令吗?
答案 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;