конвертировать значения int в datetime на сервере sql - PullRequest
2 голосов
/ 31 января 2011

Мне нужно преобразовать значения 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

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

Ответы [ 4 ]

5 голосов
/ 31 января 2011

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

select dateadd(month,(@YEAR-1900)* 12 + @MONTH - 1,0) + (@DAY-1)
1 голос
/ 31 января 2011

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

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

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

РЕДАКТИРОВАТЬ: Формат, который вы выбрали, YYYYMMDD, также не зависит от локали, если я не ошибаюсь.Моя точка зрения заключалась лишь в том, что для построения правильной строки из целых чисел требовалось более сложное выражение, что казалось вам неудобным.

1 голос
/ 31 января 2011

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

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

0 голосов
/ 31 января 2011

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

SET DATEFORMAT YMD;
SET @MAXDATE = @YEAR+'/'+@MONTH+'/'+@DAY
SELECT @MAXDATE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...