Принятие y, m, d
является всем int
, как насчет:
CAST(CAST(y AS varchar) + '-' + CAST(m AS varchar) + '-' + CAST(d AS varchar) AS DATETIME)
см. мой другой ответ для SQL Server 2012 и выше
Если Вы не хотите не допускать строки в него, это работает также (Помещенный это в функцию):
DECLARE @Day int, @Month int, @Year int
SELECT @Day = 1, @Month = 2, @Year = 2008
SELECT DateAdd(dd, @Day-1, DateAdd(mm, @Month -1, DateAdd(yy, @Year - 2000, '20000101')))
Попробуйте ПРЕОБРАЗОВЫВАЮТ вместо БРОСКА.
ПРЕОБРАЗОВЫВАЮТ, позволяет третий параметр, указывающий на формат даты.
Список форматов здесь: http://msdn.microsoft.com/en-us/library/ms187928.aspx
Обновление после того, как другой ответ был выбран как "корректный" ответ:
я действительно не понимаю, почему ответ выбран, который ясно зависит от настроек NLS на Вашем сервере, не указывая на это ограничение.
Попробуйте это:
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)))
Это работает также, обладает дополнительным преимуществом не выполнения любых преобразований строк, таким образом, это - чистая арифметика, обрабатывающая (очень быстро), и это не зависит ни от какого формата даты, который Это извлекает выгоду из того, что внутреннее представление SQL Server для даты и времени и значений smalldatetime является двумя значениями части, первая часть которых является целым числом, представляющим количество дней с 1 января 1900, и вторая часть является десятичной дробью, представляющей дробную часть одного дня (в течение времени)---, Таким образом, целочисленное значение 0 (нуль) всегда переводит непосредственно в Полуночное утро от 1 января 1900...
или, благодаря предложению от @brinary,
Select DateAdd(yy, @Year-1900,
DateAdd(m, @Month - 1, @DayOfMonth - 1))
Отредактированный октябрь 2014. Как Отмеченный @cade Заправкой для соуса, SQL 2012 теперь имеет встроенную функцию:
DATEFROMPARTS(year, month, day)
, который делает то же самое.
Отредактированный 3 октября 2016, (Благодаря @bambams для того, чтобы замечать это и @brinary для фиксации его), последнее решение, предложенное @brinary. кажется, не работает в течение многих високосных годов, если дополнение лет не выполняется сначала
select dateadd(month, @Month - 1,
dateadd(year, @Year-1900, @DayOfMonth - 1));