Динамически подсчитайте, сколько месяцев прошло - SQL Server

Я пытаюсь подсчитать, сколько месяцев назад поле даты было

У меня есть стол

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. Так что, если кто-нибудь добавит больше дат в будущем, это просто сработает, не добавляя больше дел?

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

Eric 02.05.2018 17:49

Попробуйте DATEDIFF().

Eric 02.05.2018 17:49
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам точно нужен datediff():

select datediff(month, date, getdate()) as num_months_ago

datediff() считает количество месяцев между двумя датами. Итак, 31 декабря - это «за месяц до» 1 января. Похоже, это именно то поведение, которое вы хотите.

Я не вижу преимущества помещать это в строковый формат.

что такое гетмонт?

Ryan Gadsdon 02.05.2018 17:44

dateiff (mm, month ([date]), month (getdate ())) as [num_months_ago] - это просто дает 0

Ryan Gadsdon 02.05.2018 18:26

@RyanGadsdon. . . Зачем вам так использовать datediff() и month() вместе?

Gordon Linoff 03.05.2018 03:28

Если вы хотите, чтобы это было в строковом формате:

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 на самом деле не подходит для такого типа форматирования. :)

Другие вопросы по теме