SQL как сделать так, чтобы это всегда возвращало первое число месяца - PullRequest
0 голосов
/ 23 декабря 2010

У меня есть следующий код:

DECLARE @monthPassed VARCHAR(MAX)
SET @monthPassed = '2010'

DECLARE @yearPassed VARCHAR(MAX)
SET @yearPassed = '10'

DECLARE @TempDate DATETIME
SET @TempDate = CAST(@monthPassed + '/' + '1' + '/' + @yearPassed AS DATETIME)

DECLARE @TestDate DATETIME
SET @TestDate = DATEADD(MONTH, 1, @TempDate)

Это делает @TestDate 11-02-10. Как бы я всегда делал этот возврат первым в месяце?

Ответы [ 4 ]

2 голосов
/ 23 декабря 2010

Может иметь отношение к инвертированию @monthPassed и @yearPassed.Переключение их, с моей стороны, решило проблему.

DECLARE @monthPassed VARCHAR(MAX)
SET @monthPassed = '10'

DECLARE @yearPassed VARCHAR(MAX)
SET @yearPassed = '2010'

DECLARE @TempDate DATETIME
SET @TempDate = CAST(@monthPassed + '/' + '1' + '/' + @yearPassed AS DATETIME)

DECLARE @TestDate DATETIME
SET @TestDate = DATEADD(MONTH, 1, @TempDate)

SELECT @TestDate;

Результатов:

+-------------------------+
|    (no column name)     |
+-------------------------+
| 2010-11-01 00:00:00.000 |
+-------------------------+
0 голосов
/ 23 декабря 2010

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

Рассмотрите возможность добавления проверки, чтобы убедиться, что значения параметров являются цифрами, имеют диапазон и т. Д.

Использование формата 'ггггммдд' обеспечивает защиту от региональных проблем:

DECLARE @yearPassed CHAR(4);
SET @yearPassed = '2010';

DECLARE @monthPassed CHAR(2);
SET @monthPassed = '10';

DECLARE @TestDate DATETIME
SET @TestDate = CAST(@yearPassed + @monthPassed + '01' AS DATETIME);
0 голосов
/ 23 декабря 2010
DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
0 голосов
/ 23 декабря 2010

Вы получили месяц, назначенный году, и наоборот

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...