読者です 読者をやめる 読者になる 読者になる

年、月、日 から日付型に変換する

SQL Server Advent Calendar 16日目 です。

年、月、日と数値で持っている時に、日付型に変換する方法を紹介します。
基本は、CAST および CONVERT (Transact-SQL) です。

select convert(datetime, '20131216', 112) -- 2013/12/16 00:00:00.000

と変換出来るので、年、月、日 の数値を YYYYMMDD 形式の文字列に変換します。

declare @year int = 2013
declare @month int = 12
declare @day int = 16
select cast(@year as varchar) 
  + cast(@month as varchar) 
  + cast(@day as varchar) -- 20131216

これで良さそうな気がしますが、年、月、日 がそれぞれ 4桁、2桁、2桁 無い場合は正しく変換出来ません。
という訳で、もう一工夫要ります。

declare @year int = 900
declare @month int = 1
declare @day int = 1
select right('0000' + cast(@year as varchar), 4) 
  + right('00' + cast(@month as varchar), 2) 
  + right('00' + cast(@day as varchar), 2) -- 09000101

RIGHT (Transact-SQL) を使って左0詰を行います。
これに対して convert(datetime, 'YYYYMMDD', 112) を行えば変換出来ます。*1

SQL Server 2012 以降を使っている場合は、もっと楽に変換可能です。
DATETIMEFROMPARTS (Transact-SQL)

declare @year int = 2013
declare @month int = 12
declare @day int = 16
select datetimefromparts(@year, @month, @day, 0, 0, 0, 0) 
  -- 2013/12/16 00:00:00.000

時刻を持たない date 型で良いなら引数も3つで済みます。
DATEFROMPARTS (Transact-SQL)

declare @year int = 900
declare @month int = 1
declare @day int = 1
select datefromparts(@year, @month, @day) 
  -- 900/1/1

*1:datetime は 1753 年までしか対応していないので、900年の場合は datetime2 や date を使って convert します。