Создайте дату с дневного месяца и года с T-SQL

256
задан Tab Alleman 6 August 2018 в 03:20
поделиться

4 ответа

Принятие y, m, d является всем int, как насчет:

CAST(CAST(y AS varchar) + '-' + CAST(m AS varchar) + '-' + CAST(d AS varchar) AS DATETIME)

см. мой другой ответ для SQL Server 2012 и выше

169
ответ дан Community 23 November 2019 в 02:43
поделиться

Если Вы не хотите не допускать строки в него, это работает также (Помещенный это в функцию):

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')))
4
ответ дан Robert Wagner 23 November 2019 в 02:43
поделиться

Попробуйте ПРЕОБРАЗОВЫВАЮТ вместо БРОСКА.

ПРЕОБРАЗОВЫВАЮТ, позволяет третий параметр, указывающий на формат даты.

Список форматов здесь: http://msdn.microsoft.com/en-us/library/ms187928.aspx

Обновление после того, как другой ответ был выбран как "корректный" ответ:

я действительно не понимаю, почему ответ выбран, который ясно зависит от настроек NLS на Вашем сервере, не указывая на это ограничение.

12
ответ дан devio 23 November 2019 в 02:43
поделиться

Попробуйте это:

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)); 
333
ответ дан Luke Girvin 23 November 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: