Я пытаюсь подсчитать, сколько месяцев назад поле даты было
У меня есть стол
CREATE TABLE Date(
Date Date
);
INSERT INTO Date (Date)
VALUES ('05-01-18'),
('04-01-18'),
('03-01-18'),
('02-01-18'),
('01-01-18'),
('12-01-17'),
('11-01-17');
И запрос
SELECT Date ,
MONTH(Date),
CASE WHEN MONTH(Date) = MONTH(GETDATE()) Then 'Current Month'
WHEN MONTH(Date) = MONTH(GETDATE()) -1 Then '1 Month Ago'
WHEN MONTH(Date) = MONTH(GETDATE()) -2 Then '2 Month Ago'
ELSE 'n/a' END AS [Months Ago]
FROM Date
Что дает мне правильный результат:
| Date | | Months Ago |
|------------|----|---------------|
| 2018-05-01 | 5 | Current Month |
| 2018-04-01 | 4 | 1 Month Ago |
| 2018-03-01 | 3 | 2 Month Ago |
| 2018-02-01 | 2 | n/a |
| 2018-01-01 | 1 | n/a |
| 2017-12-01 | 12 | n/a |
| 2017-11-01 | 11 | n/a |
Но есть ли способ создать это динамически, вместо того, чтобы писать выражения case. Так что, если кто-нибудь добавит больше дат в будущем, это просто сработает, не добавляя больше дел?
Попробуйте DATEDIFF().


Вам точно нужен datediff():
select datediff(month, date, getdate()) as num_months_ago
datediff() считает количество месяцев между двумя датами. Итак, 31 декабря - это «за месяц до» 1 января. Похоже, это именно то поведение, которое вы хотите.
Я не вижу преимущества помещать это в строковый формат.
что такое гетмонт?
dateiff (mm, month ([date]), month (getdate ())) as [num_months_ago] - это просто дает 0
@RyanGadsdon. . . Зачем вам так использовать datediff() и month() вместе?
Если вы хотите, чтобы это было в строковом формате:
SELECT D.[Date],
DATEPART(MONTH,D.[Date]) AS [Month],
CASE WHEN V.DD = 0 THEN 'Current Month'
WHEN V.DD = 1 THEN '1 Month Ago'
ELSE CONVERT(varchar(4), V.DD) + ' Months ago' END AS MonthsAgo
FROM [Date] D
CROSS APPLY (VALUES(DATEDIFF(MONTH, D.[Date], GETDATE()))) V(DD);
Я, однако, согласен с Гордоном, SQL Server на самом деле не подходит для такого типа форматирования. :)
Вы также должны использовать год. В вашем случае май этого года будет равен маю прошлого года.