2011-01-31 9 views
2

Мне нужно преобразовать значения int из года, месяца и дня в datetime с использованием SQL-сервера.преобразовать значения int в datetime в sql-сервере

на самом деле я»я использую этот

DECLARE @MONTH INT 
DECLARE @YEAR INT 
DECLARE @DAY INT 
DECLARE @MAXDATE DATETIME 
DECLARE @MINDATE DATETIME 

SET @MONTH=12 
SET @YEAR=2010 
SET @DAY=1 


SET @MINDATE=CONVERT(DATE,CAST (@YEAR AS VARCHAR)+ RIGHT ('0'+ CAST (@MONTH AS VARCHAR),2) + RIGHT ('0'+ CAST (@DAY AS VARCHAR),2)) 

SELECT @MINDATE 

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

ответ

5

Это было бы немного проще:

select dateadd(month,(@YEAR-1900)* 12 + @MONTH - 1,0) + (@DAY-1) 
1

Я думаю, что у вас определенно есть правильный способ сделать это. Вы уже заполняете нули за однозначные месяцы и даты; ваше решение будет работать хорошо и не является неопрятным.

Единственный другой способ - быть с какой-то произвольной датой и «добавлять» годы, месяцы и дни в эту отправную точку. Однако это не очень хороший план, потому что вы должны начать с 31 декабря, 0 года н.э. по моим расчетам. Это имеет меньшее значение, чем просто анализ компонентов, как вы сейчас делаете.

0

Недо я знаю there's никоим образом не жулик преобразовать его с встроенной функцией. Если подмигнул можно объявить год, месяц анда день как VARCHAR, это может быть проще:

SET DATEFORMAT YMD; 
SET @MAXDATE = @YEAR+'/'[email protected]+'/'[email protected] 
SELECT @MAXDATE 
+2

Вы уверены, что ** это будет работать на SQL Server, например. «Немецкий» формат даты активирован? Я очень сомневаюсь в этом - если вы сделаете что-то вроде этого (конкатенация строк), тогда ** пожалуйста **: используйте формат ISO-8601! 'YYYYMMDD' - это будет работать в любой системе с любыми языковыми настройками ... –

1

В зависимости от того, что вы имеете в виду под «лучшим способом», вы можете найти различные ответы приемлемые. Например, преобразование из строки может быть проще (и, следовательно, лучше), чем то, как это делается в вашем скрипте. Как это:

SET @MINDATE = CAST(@YEAR AS varchar) + '-' + 
       CAST(@MONTH AS varchar) + '-' + 
       CAST(@DAY AS varchar) 

То есть, если ваша переменная datetime, преобразование не будет неявным, поэтому нет необходимости использовать CONVERT. Формат, выбранный здесь, равен YYYY-MM-DD, или, скорее, YYYY-M-D, что, насколько мне известно, приемлемо для неявного преобразования, независимо от настроек локали.

EDIT: Формат, который вы выбрали, YYYYMMDD, также не зависит от локали, если я не ошибаюсь. Моя точка зрения заключалась только в том, что для построения правильной строки из целых чисел требовалось более сложное выражение, которое, казалось, создавало неудобства для вас.

Смежные вопросы