Динамически рассчитать, сколько месяцев прошло - SQL Server - PullRequest
0 голосов
/ 02 мая 2018

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

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

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 |

Но есть ли возможность создать это динамически, вместо того, чтобы продолжать писать выражения регистра. Так что, если кто-нибудь добавит больше дат в будущем, это будет работать без необходимости добавлять больше дел?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

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

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

0 голосов
/ 02 мая 2018

Вы точно хотите datediff():

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

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

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

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