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 します。