2014年7月10日木曜日

SQL Server 月日の取得

何月何日というデータを、例えば7月1日なら'0701'という形式で取得したいことがあります。

SQL Serverで行う場合何通りか方法があるかと思いますが、
いくつか調べた結果をメモしておきます。
(試したバージョンはSQL Server 2012、ロケールは日本)

DECLARE @d datetime
set @d = CONVERT(datetime,  '2014-07-01')

/* DATENAME */
select DATENAME(yyyy, @d )  -- 2014
select DATENAME(yy, @d )    -- 2014
select DATENAME(m, @d )     -- 07
select DATENAME(mm, @d )    -- 07
select DATENAME(d, @d )     -- 1
select DATENAME(dd, @d )    -- 1
select DATENAME(m, @d) + right('0' + DATENAME(d, @d), 2) -- 0701

/* CONVERT */
select CONVERT(nvarchar(10),@d,12)  -- 140701
select CONVERT(nvarchar(10),@d,112) -- 20140701
select CONVERT(nvarchar(10),@d,111) -- 2014/07/01
select right(CONVERT(nvarchar(10),@d,12),4) -- 0701

/* FORMAT */
select FORMAT(@d,'M')    -- 7月1日
select FORMAT(@d,'MM')   -- 07
select FORMAT(@d,'MMM')  -- 7
select FORMAT(@d,'MMMM') -- 7月
select FORMAT(@d,'d')    -- 2014/07/01
select FORMAT(@d,'dd')   -- 01
select FORMAT(@d,'ddd')  -- 火
select FORMAT(@d,'dddd') -- 火曜日
select FORMAT(@d,'MMdd') -- 0701


いかがでしょう。掲載したのはほんの一部ですが、予想と違う結果になっていないでしょうか。
DATENAMEの「m」が2ケタで「d」が1ケタだったり、
DATENAMEの「m」が2ケタで「mm」が2ケタだったり、
FORMATの「M」が7月1日になったり、
FORMATの「d」が2014/07/01になったり。
ちなみに、FORMAT関数は2008 R2以降となっていましたが、updateが当たってないのか
私の環境では2008 R2でもエラーになりました。


DATENAME関数
FORMAT関数
CONVERT関数