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


87

我需要像'Jan 2008'这样的SQL Server中日期时间的月份+年。我按月,年对查询进行分组。我已经搜索并找到了诸如datepart,convert等功能,但是它们似乎都没有用。我在这里想念什么吗?有这个功能吗?


@Evan Carroll-这是否构成劫持问题?如果您对问题有一个很好的答案,是否应该将其作为问题的答案而不是将人们指向其他问题?
STLDev '17

@STLDeveloper如何劫持。问题要求2005年吗?我没有把那放在那里。我不是在寻找2005年。不幸的是,此处的最佳答案不适用于2005年,而是针对2012年的。我应该否决过时的2005年答案?
埃文·卡罗尔

@STLDeveloper实际上,我不在这里。=)我的官方立场一直是建议人们使用PostgreSQL,不确定我为什么要提供帮助。
埃文·卡罗尔

我觉得奇怪的是,您又回过头来为该产品的其他版本创建该问题的新版本,然后回答该问题,我认为这很好。
STLDev '17

Answers:


74

如果您想让它们以字符串形式返回,则应采用这种格式;

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

这是其他格式选项


我在SQL Server上尝试使用CONVERT(CHAR(4),GetDate(),100),却得到了“ 09 1”。我使用“选择CONVERT(VARCHAR,GETDATE(),100)”产量“09 17 2009年下午4:59”为17的空间和一个“1”
午睡

1
这很奇怪-从我链接到的文档来看,如果将100换成CHAR(4),应该返回三个字母的月缩写和一个空格。但是,然后,您为CONVERT(varchar,getdate(),100)发布的结果看起来与我期望的结果不同。您正在使用哪个版本的SQLServer?您使用的是哪种本地化/国际化设置(不是100格式重要)。
robsoft

171
select 
datepart(month,getdate()) -- integer (1,2,3...)
,datepart(year,getdate()) -- integer
,datename(month,getdate()) -- string ('September',...)

因此,我认为这是我想要的,但是我看不到TSQL如何理解datepart(month,getdate())and的区别datepart(year,getdate())。什么是月份年份
jp2code 2013年

4
@ jp2code的月份年份基本上是在此处定义的常量:msdn.microsoft.com/en-us/library/ms174420.aspx。TSQL通过阅读它们来理解它们的方式与您相同:)
Zachary Yates 2013年

1
大声笑-谢谢Zach。我看了很长时间才出演,然后在另一个网站上弄清楚了。
jp2code 2013年

比转换功能干净得多。#cleanCode
RBT


12

使用:

select datepart(mm,getdate())  --to get month value
select datename(mm,getdate())  --to get name of month

11

有趣的是,我只是在四处游玩,在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

9

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

选择FORMAT(getdate(),'MMM yyyy')

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


6

这个怎么样?

Select DateName( Month, getDate() ) + ' ' + DateName( Year, getDate() )


5

该格式不存在。您需要将两件事结合起来,

select convert(varchar(4),getdate(),100)  + convert(varchar(4),year(getdate()))

4

最好的方法是:

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

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


1
到目前为止,这是将日期强制为月和年而不考虑日期和时间组成部分的最佳答案。比接受的答案好得多,因为可以正确地对信息进行排序并且可以在下游报告工具中正确地将其作为日期使用。
杰米·托马斯

我完全同意,这是迄今为止开始月初的最佳方法。它保留数据类型为datetime,并将渲染保留在应有的前端。这是执行诸如按字段月份对行进行分组之类的正确方法。
杰夫·巴特纳

2

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

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

2
该问题已经有18个其他答案。您的答案会添加哪些新信息?
stannius

1

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

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

效果很好!


1

将日期转换为一个月的第一天,可以使您根据单个属性进行分组和排序,根据我的经验,它更快。

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 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


1

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

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

SQL Server 2005不具有SQL Server 2008中引入的日期功能



0
  ,datename(month,(od.SHIP_DATE)) as MONTH_

答案:MONTH_ 1月1月9月10月12月10月9月


0

很好

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.