提问人:Malik Daud Ahmad Khokhar 提问时间:9/5/2008 最后编辑:Evan CarrollMalik Daud Ahmad Khokhar 更新时间:6/3/2017 访问量:838557
从 SQL Server 2005 中的日期时间获取月份和年份
Get month and year from a datetime in SQL Server 2005
问:
我需要 SQL Server 中日期时间的月份+年份,例如“2008 年 1 月”。我按月、年对查询进行分组。我搜索并找到了 datepart、convert 等函数,但它们似乎都没有用。我在这里遗漏了什么吗?有这个功能吗?
答:
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
评论