SQL Server2005の日時から月と年を取得する


87

「2008年1月」のようなSQLServerの日時からの月と年が必要です。クエリを月、年でグループ化しています。datepart、convertなどの関数を検索して見つけましたが、どれもこれに役立つようには見えません。ここで何かが足りませんか?このための機能はありますか?


@Evan Carroll-これは質問のハイジャックを構成しますか?質問に対する優れた回答がある場合、人々に別の質問を示す代わりに、質問に対する回答として提供するべきではありませんか?
STLDev 2017

@STLDeveloperはどのようにハイジャックしていますか。質問は2005年を求めていますか?私はそこにそれを置きませんでした。私は2005年を探していません。残念ながら、ここでの最良の答えは2005年には機能せず、2012年に明示されています。古風であるという2005年の回答に反対票を投じるべきですか?
エヴァンキャロル

@STLDeveloper実際、私はここでは気にしません。=)私の公式のスタンスは、常にPostgreSQLを使用するように人々にアドバイスすることでしたが、なぜ私が助けようとしているのかわかりません。
エヴァンキャロル

製品の別のバージョンの質問の新しいバージョンを作成し、その質問に答えるために戻ったのは奇妙に思えましたが、それは問題ないと思います。
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)を使用してみましたが、代わりに「091」を取得しました。「selectCONVERT(varchar、GetDate()、100)」を使用して、17のスペースと「1」を1つ取得しました。yield "09 17 2009 4:59 PM"
Nap

1
それは奇妙です-私がリンクしたドキュメントから、100はCHAR(4)にチャックされている場合、3文字の月の省略形とスペースを返すはずです。しかし、CONVERT(varchar、getdate()、100)に対して投稿した結果は、私が期待するものとは異なって見えます。どのバージョンのSQLServerを使用していますか?どのローカリゼーション/国際化設定を使用していますか(これは100形式では重要ではありません)。
robsoft 2009

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

4
@ jp2codeのは、基本的にここで定義されている定数です:msdn.microsoft.com/en-us/library/ms174420.aspx。TSQLは、それらを読むことで、あなたと同じようにそれらを理解します:)
Zachary Yates 2013年

1
笑-ザックに感謝します。別のサイトでそれを理解する前に、私はそれを長い間主演しました。
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

そのフォーマットは存在しません。あなたは2つのことの組み合わせをする必要があります、

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

4

それを行うための最良の方法は:

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

それはあなたの日時タイプを保持します


1
これは、日と時間の要素を無視して、日付を月と年だけにするための最善の答えです。情報を正しく並べ替えることができ、ダウンストリームのレポートツールで日付として正しく機能するため、受け入れられた回答よりもはるかに優れています。
ジェイミートーマス

私は、これが月の初めを取得するための最善の方法であることに心から同意します。データ型をdatetimeに保ち、レンダリングをフロントエンドに任せます。これは、フィールドの月ごとに行をグループ化するなどの正しい方法です。
Jeff Breadner 2018年

2

完全な月の名前を返します-、通年など March-2017

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

2
この質問に対する他の18の答えがすでにあります。あなたの答えはどのような新しい情報を追加しますか?
stannius 2017年

1

私は同じ問題を抱えていました、そして周りを見回した後、私はこれを見つけました:

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

それはうまく機能しています!


1

日付を月の最初に変換すると、単一の属性でGroupByとOrderByを実行でき、私の経験ではより高速になります。

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





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 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.