Essayez ceci :
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)))
Cela fonctionne aussi, a ajouté l'avantage de ne faire aucune conversion de chaîne, donc c'est un traitement arithmétique pur (très rapide) et il ne dépend d'aucun format de date Cela capitalise sur le fait que la représentation interne de SQL Server pour les valeurs datetime et smalldatetime est en deux parties valeur dont la première partie est un nombre entier représentant le nombre de jours depuis le 1er janvier 1900, et la seconde partie est une fraction décimale représentant la partie fractionnaire d'un jour (pour l'heure) --- Soit la valeur entière 0 (zéro) se traduit toujours directement par Minuit matin du 1er janvier 1900...
ou, grâce à la suggestion de @brinary,
Select DateAdd(yy, @Year-1900,
DateAdd(m, @Month - 1, @DayOfMonth - 1))
Edité en octobre 2014. Comme l'a noté @cade Roux, SQL 2012 a maintenant une fonction intégrée :DATEFROMPARTS(year, month, day)
qui fait la même chose.
Edité le 3 octobre 2016, (Merci à @bambams pour avoir remarqué cela, et @brinary pour l'avoir corrigé), La dernière solution, proposée par @brinary. ne semble pas fonctionner pour les années bissextiles à moins que l'ajout d'années ne soit effectué en premier
select dateadd(month, @Month - 1,
dateadd(year, @Year-1900, @DayOfMonth - 1));