SQL Server 日付関係の関数・処理をまとめてみる

日付関係の処理をまとめてみますよ、と。


まずは使えそうな関数から。



現在の日付を確認

GETDATE()


現在の日付を返す
とりあえず現在の日時を知りたいときは
SELECT GETDATE()



日付を移動する
DATEADD (datepart , number , date )


指定した単位分、日付を移動させる。

datapartには
単位(という表現であってるのか?)を指定する
以下、よく使いそうなものを並べてみる
(かっこ内は省略形)

・日:day(dd,d),dayofyear(dy),weekday(wd)

・月:month(mm,m) *1

・四半期:quater(qq,q)

・年:year(yy,y)


*1)戻り値が存在しない場合、戻り値の月の最後の日が帰ってくる
  つまり
    DATEADD(month,1,'2012/08/30')
    DATEADD(month,1,'2012/08/31')
   は同じ結果('2012/09/30')をかえしますよ。


SELECT DATEADD(DAY,3,GETDATE())      -- 現在から3日後の日時

SELECT DATEADD(MONTH,1,GETDATE())    --1か月後の日付

SELECT DATEADD(MONTH,1,'2012-07-31') --1か月後の日付(2012-8-31)

SELECT DATEADD(MONTH,1,'2012-07-31') --2か月後の日付(2012-9-30) 




日付の取り出し

日付から、年や月、日だけをとりたい!
ってときにですが。

YEAR(date),MONTH(date),DAY(date)

それぞれ、年、月、日を返します。


DATENAME(interval, date)
DATEPART(interval, date)

両方とも特定の部分を切り出す関数です。
DATENAMEの場合は、戻り値がvarchar、
DATEPARTの場合、戻り値がintになります

intervalに指定するものによって戻り値がちがってきます
・YEAR,MONTH,DAYを指定した場合はそれぞれの年、月、日
・DAYOFYEAR,WEEKをしていた場合は、それぞれ年始まり(1月1日)からの日数、週数を返す
・WEEKDAYを指定した場合は、DATENAMEとDATEPARTで動きがちがって
  DATENAMEでは曜日を返す(木曜日)
  DATEPARTでは曜日番号を返す(1=月曜日、・・・)
  という風になってます。
・QUARTER(qq,q)を指定した場合、四半期を返す。
  ここでいう四半期は1/1~3/31が1になります。
  4/1~=「第一四半期」ではないので注意うっかりしないように(おもに自分が)
SELECT DATENAME(YEAR,GETDATE()), YEAR(GETDATE()) -- 年を返す(両方とも同じ値を返す)

SELECT DATENAME(MONTH,GETDATE()), MONTH(GETDATE()) -- 月を返す(両方とも同じ値を返す)

SELECT DATENAME(DAY,GETDATE()), DAY(GETDATE())  -- 日を返す(両方とも同じ値を返す)

SELECT DATENAME(WEEKDAY,GETDATE()), DATEPART(WEEKDAY,GETDATE()) -- 1列目:今日の曜日(日本語)、2列目:週番号


日付演算には算術演算子を使わない方が無難。
理由は↓
http://japan.internet.com/developer/20071113/26.html