Spróbuj tego:
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)))
Działa również, ma dodatkową zaletę, że nie wykonuje żadnych konwersji ciągów, więc jest to czyste przetwarzanie arytmetyczne (bardzo szybkie) i nie jest zależne od żadnego formatu daty. Wykorzystuje to fakt, że wewnętrzna reprezentacja SQL Server dla wartości datetime i smalldatetime jest dwuczęściowa wartość, której pierwsza część jest liczbą całkowitą reprezentującą liczbę dni od 1 stycznia 1900, a druga część jest ułamkiem dziesiętnym reprezentującym część ułamkową jednego dnia (dla czasu) --- Czyli wartość całkowita 0 (zero) zawsze przekłada się bezpośrednio na północ rano 1 stycznia 1900...
lub, dzięki sugestii @brinary,
Select DateAdd(yy, @Year-1900,
DateAdd(m, @Month - 1, @DayOfMonth - 1))
Edytowane w październiku 2014 r. Jak zauważył @cade Roux, SQL 2012 ma teraz wbudowaną funkcję:DATEFROMPARTS(year, month, day)
to robi to samo.
Edytowane 3 października 2016, (Podziękowania dla @bambams za zauważenie tego i @brinary za naprawienie tego), Ostatnie rozwiązanie zaproponowane przez @brinary. nie wydaje się działać przez lata przestępne, chyba że najpierw zostanie wykonane dodawanie lat
select dateadd(month, @Month - 1,
dateadd(year, @Year-1900, @DayOfMonth - 1));