Создание даты в SQL Server 2008

Есть ли что-то похожее на DATEFROMPARTS(year, month, day) в SQL Server 2008? Я хочу создать дату, используя текущий год и месяц, но мой собственный день месяца. Это необходимо сделать в одной строке для использования в вычисленной формуле столбца.

Для примера (я не уверен, что он работает, потому что у меня нет SQL Server 2012):

DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 3)

Есть ли способ сделать это в SQL Server 2008?

DATEFROMPARTS Доступно только в SQL Server 2012 (ссылка)

Ответы

Ответ 1

Используя 3 из вашего примера, вы можете сделать это:

dateadd(dd, 3 -1, dateadd(mm, datediff(mm,0, current_timestamp), 0))

Он работает, набирая количество месяцев с даты эпохи, добавляя эти месяцы назад к дате эпохи, а затем добавляя желаемое количество дней к этому предыдущему результату. Это звучит сложно, но он основан на каноническом способе усечения дат до типа Date (not DateTime), добавленного в Sql Server 2008.

Вероятно, вы увидите другие ответы, предлагающие строковые строки. Я призываю вас избегать этой техники. Использование строк, вероятно, будет намного медленнее, и есть некоторые потенциальные проблемы с альтернативными комбинациями дат/форматами.

Ответ 2

Вы можете использовать что-то вроде этого, чтобы создать свое собственное datetime:

DECLARE @year INT = 2012
DECLARE @month INT = 12
DECLARE @day INT = 25

SELECT CAST(CONVERT(VARCHAR, @year) + '-' + CONVERT(VARCHAR, @month) + '-' + CONVERT(VARCHAR, @day)
 AS DATETIME)

Ответ 3

CREATE FUNCTION  DATEFROMPARTS
(
    @year int,
    @month int,
    @day int
)
RETURNS datetime
AS
BEGIN

     declare @d datetime

     select @d =    CAST(CONVERT(VARCHAR, @year) + '-' + CONVERT(VARCHAR, @month) + '-' + CONVERT(VARCHAR, @day) AS DATETIME)
    RETURN  @d 

END
GO