从 SQL Server 2005 中的日期时间获取月份和年份

Get month and year from a datetime in SQL Server 2005

提问人:Malik Daud Ahmad Khokhar 提问时间:9/5/2008 最后编辑:Evan CarrollMalik Daud Ahmad Khokhar 更新时间:6/3/2017 访问量:838557

问:

我需要 SQL Server 中日期时间的月份+年份,例如“2008 年 1 月”。我按月、年对查询进行分组。我搜索并找到了 datepart、convert 等函数,但它们似乎都没有用。我在这里遗漏了什么吗?有这个功能吗?

sql-server

评论

0赞 STLDev 4/4/2017
@Evan卡罗尔 - 这是否构成劫持问题?如果你对这个问题有一个更好的答案,难道不应该把它作为问题的答案提供,而不是将人们指向一个不同的问题吗?
0赞 Evan Carroll 4/4/2017
@STLDeveloper劫持是怎么回事。问题需要2005年?我没有把它放在那里。我不是在寻找 2005 年。不幸的是,这里的最佳答案不适用于 2005 年,而是 2012 年。我应该对 2005 年的答案投反对票吗?
0赞 Evan Carroll 4/4/2017
@STLDeveloper实际上,我不在乎这里。=) 我的官方立场一直是建议人们使用 PostgreSQL,不知道我为什么要提供帮助。
0赞 STLDev 4/4/2017
在我看来很奇怪,你回去为不同版本的产品创建一个新版本的问题,然后回答这个问题,我想这很好。

答:

6赞 SQLMenace 9/5/2008 #1

这种格式不存在。你需要做两件事的组合,

select convert(varchar(4),getdate(),100)  + convert(varchar(4),year(getdate()))
80赞 robsoft 9/5/2008 #2

如果你的意思是你希望它们以字符串的形式返回,以这种格式;

SELECT 
  CONVERT(CHAR(4), date_of_birth, 100) + CONVERT(CHAR(4), date_of_birth, 120) 
FROM customers

以下是其他格式选项

评论

0赞 Nap 9/17/2009
我尝试在我的 SQL Server 上使用 CONVERT(CHAR(4), GetDate(), 100),结果我得到了“09 1”。我得到了空间和 17 个“1”。使用 “select CONVERT(varchar, GetDate(), 100)” 产生 “09 17 2009 4:59PM”
1赞 robsoft 9/17/2009
这很奇怪 - 从我链接到的文档中,如果放入 CHAR(4) 中,100 应该返回一个三个字母的月份缩写和一个空格。但是,您发布的 CONVERT(varchar, getdate(), 100) 结果看起来与我期望看到的不同。您使用的是哪个版本的 SQLServer?您使用的是哪些本地化/国际化设置(这并不是说这对 100 格式很重要)。
176赞 HS. 9/5/2008 #3
select 
datepart(month,getdate()) -- integer (1,2,3...)
,datepart(year,getdate()) -- integer
,datename(month,getdate()) -- string ('September',...)

评论

0赞 6/3/2013
所以,我认为这是我想要的,但我不明白 TSQL 如何理解 和 之间的区别。什么是datepart(month,getdate())datepart(year,getdate())
4赞 Zachary Yates 6/6/2013
@jp2code月份年份基本上是这里定义的常数:msdn.microsoft.com/en-us/library/ms174420.aspx。TSQL的理解方式与您相同,通过读取它们:)
1赞 6/6/2013
大声笑 - 谢谢扎克。我盯着它看了很久,然后在另一个网站上弄清楚了。
0赞 RBT 1/9/2017
比转换功能干净得多。#cleanCode
5赞 Tom 1/15/2009 #4
( Month(Created) + ',' + Year(Created) ) AS Date
12赞 Mike Geise 1/15/2009 #5

有趣的是,我只是在 SQL Server 和 LINQ 中编写相同的查询。

SELECT 
    DATENAME(mm, article.Created) AS Month, 
    DATENAME(yyyy, article.Created) AS Year, 
    COUNT(*) AS Total 
FROM Articles AS article 
GROUP BY 
    DATENAME(mm, article.Created), 
    DATENAME(yyyy, article.Created) 
ORDER BY Month, Year DESC

它产生以下输出(示例)。

Month | Year | Total

January | 2009 | 2
1赞 Lior 5/9/2009 #6

我遇到了同样的问题,环顾四周后,我发现了这一点:

SELECT DATENAME(yyyy, date) AS year
FROM Income
GROUP BY DATENAME(yyyy, date)

效果很好!

7赞 GordyII 5/14/2009 #7

这个怎么样?

Select DateName( Month, getDate() ) + ' ' + DateName( Year, getDate() )
0赞 Alok Kumar 1/21/2010 #8

是的,您可以使用文本获取月份。datename(month,intime)

13赞 don 11/22/2010 #9

用:

select datepart(mm,getdate())  --to get month value
select datename(mm,getdate())  --to get name of month
-3赞 Matteo 3/22/2011 #10

以下工作完美!我刚刚用过,试试看。

date_format(date,'%Y-%c')

评论

2赞 franko_camron 8/9/2012
这不是有效的 SQL Server 函数或语句
1赞 Ron Smith 4/12/2013 #11

将日期转换为每月的第一天,您可以对单个属性进行分组依据和排序依据,而且根据我的经验,速度更快。

declare @mytable table(mydate datetime)
declare @date datetime
set @date = '19000101'
while @date < getdate() begin
    insert into @mytable values(@date)
    set @date = dateadd(day,1,@date)
end

select count(*) total_records from @mytable

select dateadd(month,datediff(month,0,mydate),0) first_of_the_month, count(*) cnt
from @mytable
group by dateadd(month,datediff(month,0,mydate),0)
1赞 Lalmuni Singh 10/8/2013 #12
---Lalmuni Demos---
create table Users
(
userid int,date_of_birth date
)
---insert values---
insert into Users values(4,'9/10/1991')

select DATEDIFF(year,date_of_birth, getdate()) - (CASE WHEN (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()),date_of_birth)) > getdate() THEN 1 ELSE 0 END) as Years, 
MONTH(getdate() - (DATEADD(year, DATEDIFF(year, date_of_birth, getdate()), date_of_birth))) - 1 as Months, 
DAY(getdate() - (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()), date_of_birth))) - 1 as Days,
from users
2赞 Gareth Thomas 10/18/2013 #13
cast(cast(sq.QuotaDate as date) as varchar(7))

给出“2006-04”格式

5赞 cyber cyber1621 6/1/2014 #14

最好的方法是:

dateadd(month,datediff(month,0,*your_date*),0)

它将保留您的日期时间类型

评论

1赞 Jamie Thomas 12/2/2016
这是迄今为止强制任何日期仅为月份和年份的最佳答案,而忽略了日期和时间组件。比公认的答案要好得多,因为信息可以正确排序,并且可以在下游报告工具中正确地用作日期。
0赞 Jeff Breadner 6/15/2018
我全心全意地同意,这是迄今为止获得月初的最佳方式。它保留数据类型 datetime,并将呈现保留到前端,即它应该在的位置。这是按字段的月份对行进行分组等操作的正确方法。
72赞 CrimsonKing 11/24/2014 #15

从 SQL Server 2012 开始,可以使用:

SELECT FORMAT(@date, 'yyyyMM')

评论

1赞 J.S.Orris 3/17/2015
打得好先生......这回答了我在 2012 年的问题
0赞 Niklas 6/15/2016
我很高兴我滚动到这里,这很整洁和简单。谢谢!
0赞 Evan Carroll 4/4/2017
这是一个有价值的贡献,但应该在其他地方得到回答,stackoverflow.com/a/43196370/124486
2赞 TheTechGuy 4/8/2015 #16

该问题与 SQL Server 2005 有关,此处的许多答案都适用于更高版本的 SQL Server。

select convert (varchar(7), getdate(),20)
--Typical output 2015-04

SQL Server 2005 没有 SQL Server 2008 中引入的日期函数

0赞 khmer angkor 11/11/2015 #17
  ,datename(month,(od.SHIP_DATE)) as MONTH_

答: 月_ 一月 一月 九月 十月 十二月 十月 九月

13赞 webbuilder 6/18/2016 #18

在 SQL Server 2012 中,可以使用以下内容

select FORMAT(getdate(), 'MMM yyyy')

这给出了确切的“2016 年 6 月”

2赞 RobertC 3/9/2017 #19

返回完整的月份名称、-、整年,例如March-2017

CONCAT(DATENAME(mm, GetDate()), '-', DATEPART(yy, GetDate()))

评论

2赞 stannius 3/9/2017
这个问题已经有 18 个其他答案。您的答案增加了哪些新信息?
0赞 GanbatSu 6/3/2017 #20

这很棒。

DECLARE @pYear VARCHAR(4)

DECLARE @pMonth VARCHAR(2)

DECLARE @pDay VARCHAR(2)

SET @pYear  = RIGHT(CONVERT(CHAR(10), GETDATE(), 101), 4)

SET @pMonth = LEFT(CONVERT(CHAR(10), GETDATE(), 101), 2)

SET @pDay   = SUBSTRING(CONVERT(CHAR(10), GETDATE(), 101), 4,2)

SELECT @pYear,@pMonth,@pDay