Zkuste toto:
Declare @DayOfMonth TinyInt Set @DayOfMonth = 13
Declare @Month TinyInt Set @Month = 6
Declare @Year Integer Set @Year = 2006
-- ------------------------------------
Select DateAdd(day, @DayOfMonth - 1,
DateAdd(month, @Month - 1,
DateAdd(Year, @Year-1900, 0)))
Funguje to také, má další výhodu v tom, že neprovádí žádné převody řetězců, takže jde o čisté aritmetické zpracování (velmi rychlé) a není závislé na žádném formátu data. To těží ze skutečnosti, že interní reprezentace SQL Serveru pro hodnoty datetime a smalldatetime je dvoudílná. hodnota, jejíž první část je celé číslo představující počet dní od 1. ledna 1900 a druhá část je desetinný zlomek představující zlomkovou část jednoho dne (pro daný čas) --- Takže celočíselná hodnota 0 (nula) se vždy překládá přímo do půlnočního rána 1. ledna 1900...
nebo díky návrhu od @brinary
Select DateAdd(yy, @Year-1900,
DateAdd(m, @Month - 1, @DayOfMonth - 1))
Upraveno v říjnu 2014. Jak poznamenal @cade Roux, SQL 2012 má nyní vestavěnou funkci:DATEFROMPARTS(year, month, day)
to dělá to samé.
Upraveno 3. října 2016 (Děkujeme @bambams, že si toho všiml, a @brinary za opravu), Poslední řešení navržené @brinary. nezdá se, že by fungoval v přestupných letech, pokud se nejprve neprovede sčítání let
select dateadd(month, @Month - 1,
dateadd(year, @Year-1900, @DayOfMonth - 1));