SQL Server 2005의 날짜 / 시간에서 월 및 연도 가져 오기


87

'Jan 2008'과 같은 SQL Server의 datetime에서 월 + 연도가 필요합니다. 월, 연도별로 쿼리를 그룹화하고 있습니다. 나는 datepart, convert 등과 같은 기능을 검색하고 찾았지만 그중 어느 것도 이것에 유용하지 않은 것 같습니다. 여기에 뭔가 빠졌나요? 이것에 대한 기능이 있습니까?


@Evan Carroll-이것이 질문을 납치하는 것으로 간주됩니까? 질문에 대한 더 우수한 답변이 있다면 사람들에게 다른 질문을 지시하는 대신 질문에 대한 답변으로 제공하지 않아야합니까?
STLDev 2017

@STLDeveloper는 어떻게 납치하고 있습니까? 질문은 2005 년을 요구합니까? 나는 거기에 넣지 않았다. 저는 2005 년을 찾고 있지 않습니다. 불행히도 여기에서 가장 좋은 대답은 2005 년에는 작동하지 않습니다. 2012 년에는 명시 적입니다. 고풍스러운 2005 년 답변에 반대 투표를해야합니까?
Evan Carroll

@STLDeveloper 사실, 나는 여기서 상관하지 않습니다. =) 내 공식 입장은 항상 사람들에게 PostgreSQL을 사용하도록 조언하는 것이었지만, 왜 내가 돕고 있는지 확실하지 않습니다.
Evan Carroll

제품의 다른 버전에 대한 질문의 새 버전을 생성하고 그 질문에 답하기 위해 돌아간 것이 나에게는 이상하게 보였습니다.
STLDev 2017

답변:


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"을 얻었습니다. "select CONVERT (varchar, GetDate (), 100)"yield "09 17 2009 4:59 PM"사용
Nap

1
이상합니다. 내가 링크 한 문서에서 100은 CHAR (4)에 넣은 경우 3 글자 월 약어와 공백을 반환해야합니다. 그러나 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())datepart(year,getdate()). 연도 는 무엇입니까 ?
jp2code

4
@ jp2code 연도 는 기본적으로 msdn.microsoft.com/en-us/library/ms174420.aspx에 정의 된 상수 입니다. TSQL은 :)을 읽고, 그들에게 당신이 같은 방식을 이해
재커리 예이츠

1
LOL-감사합니다 Zach. 나는 다른 사이트에서 그것을 알아 내기 전에 오랫동안 그것을 주연시켰다.
jp2code

변환 기능보다 훨씬 깨끗합니다. #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
( Month(Created) + ',' + Year(Created) ) AS Date

5

그 형식은 존재하지 않습니다. 두 가지를 조합해야합니다.

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

4

이를 수행하는 가장 좋은 방법은 다음과 같습니다.

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

그것은 당신의 datetime 유형을 유지합니다


1
이것은 날짜와 시간 구성 요소를 무시하고 날짜를 월과 연도로 강제하는 가장 좋은 대답입니다. 정보가 올바르게 정렬되고 다운 스트림보고 도구에서 날짜로 올바르게 작동하기 때문에 허용 된 답변보다 훨씬 낫습니다.
Jamie Thomas

나는 이것이 달의 시작을 얻는 가장 좋은 방법이라는 데 전심으로 동의합니다. 데이터 유형 datetime을 유지하고 렌더링을 프런트 엔드에 남겨 둡니다. 이것은 필드의 월별로 행 그룹화와 같은 작업을 수행하는 올바른 방법입니다.
Jeff Breadner

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

날짜를 매월 1 일로 변환하면 단일 속성으로 Group By 및 Order By가 가능하며 내 경험상 더 빠릅니다.

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,intime)하여 해당 월을 텍스트로 가져올 수 있습니다 .


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

-3

다음은 완벽하게 작동합니다! 방금 사용했습니다. 사용해보세요.

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

2
이 유효한 SQL 서버 기능이나 문이 아닌
franko_camron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.