跨年边界返回前几个月的数据 - SQL Server



小提琴:http://sqlfiddle.com/#!18/5d05a/3

我有表格:

CREATE TABLE Table1(
Date Date,
Figure int
);
INSERT INTO Table1 (Date, Figure)
VALUES ('06-06-18','25'),
('05-12-18','30'),
('05-27-17','30');

我使用此查询返回前几个月的数据

DECLARE @PrevMonth int = MONTH(getdate()) -1,
@Year int = YEAR(getdate())

SELECT @Year AS [Year], @PrevMonth AS [Month], Figure
FROM Table1
WHERE MONTH([Date]) = @PrevMonth
AND YEAR([Date]) = @Year

其中返回:

| Year | Month | Figure |
|------|-------|--------|
| 2018 |     5 |     30 |

但是,一旦我到了新年的 1 月,这就行不通了。在那个新年的1月,我会寻找前一年的12月。谁能建议我使用一种更好的方法,该方法将在新的一年中涵盖 Jan。谢谢

查询查询的月份和年份部分是减慢查询速度的好方法。最好对输入参数(在本例中为GETDATE()(而不是列进行日期操作:

SELECT *
FROM Table1
WHERE [Date] >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1,0)
AND [date] < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0);

不要在表的列上使用函数(这会使它们不可 SARG使用,并且无法正确使用索引(。您可以改用一个好的日期过滤器。

DECLARE @StartDate DATE = DATEADD(DAY, 1,EOMONTH(GETDATE(), - 2))
DECLARE @EndDate DATE = DATEADD(DAY, 1,EOMONTH(GETDATE(), -1))
SELECT Figure FROM Table1
WHERE [Date] >= @StartDate AND [Date] < @EndDate

最新更新