Дата создания в 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 (ссылка)


person Jaiesh_bhai    schedule 22.10.2013    source источник
comment
возможный дубликат Создание даты с помощью T-SQL   -  person T I    schedule 22.10.2013
comment
Я видел этот ответ, можно ли его использовать в формуле вычисляемого столбца?   -  person Jaiesh_bhai    schedule 22.10.2013
comment
@Jaiesh_bhai - постоянный или непостоянный вычисляемый столбец?   -  person Martin Smith    schedule 22.10.2013
comment
@MartinSmith не сохраняется   -  person Jaiesh_bhai    schedule 22.10.2013


Ответы (3)


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

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

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

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

person Joel Coehoorn    schedule 22.10.2013
comment
@MartinSmith Спасибо, исправлено: o На мгновение забыл, что я буду добавлять дни к 1 вместо 0. - person Joel Coehoorn; 22.10.2013
comment
Кажется, где-то есть синтаксическая ошибка, я не вижу синтаксической ошибки после внесенных изменений. Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'dd'. - person Jaiesh_bhai; 22.10.2013
comment
@Jaiesh_bhai В какой-то момент мне тоже не хватало закрывающих скобок. Если я поставлю select перед тем, что там сейчас, и вставлю его прямо в окно запроса в Management Studio, я получу 2013-10-03 00:00:00.000, если запущу его прямо сейчас. - person Joel Coehoorn; 22.10.2013
comment
Ох, ладно! Спасибо, что это было глупо с моей стороны. Я забыл SELECT. Это именно то, что я ищу. - person Jaiesh_bhai; 22.10.2013

Вы можете использовать что-то вроде этого, чтобы создать собственное 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)
person Ken Richards    schedule 22.10.2013
comment
Вероятно, было бы менее подвержено ошибкам преобразование года в CHAR (4), а месяца и дня в CHAR (2). В вашем примере они жестко запрограммированы, но при нормальном использовании они могут поступать откуда-то еще, и это может вызвать проблемы, если эти параметры не имеют ожидаемой длины. - person levininja; 11.12.2019

person    schedule
comment
Попробовал сегодня с клиентом на старой версии sql, и это сработало как чемпион! - person MDV2000; 25.02.2019