动态计算已经过了多少个月 - SQL Server

时间:2018-05-02 15:36:57

标签: sql sql-server date

我想计算几个月前的日期字段是

我有一张桌子

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表达式。因此,如果有人在未来添加更多日期,这将无需添加更多案例就可以使用吗?

2 个答案:

答案 0 :(得分:3)

您确实想要datediff()

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

datediff()计算两个日期之间的月份边界数。所以,12月31日是“1月1日前一个月”。这似乎是你想要的行为。

我认为把它放在字符串格式中没有优势。

答案 1 :(得分:0)

如果您确实希望它具有字符串格式:

{{1}}
但是,我同意Gordon的观点,SQL Server并不是真正的那种格式。 :)