跨年度边界返回上个月的数据-SQL Server

跨年度边界返回上个月的数据-SQL Server,sql,sql-server,Sql,Sql Server,小提琴: 我有桌子: 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()) S

小提琴:

我有桌子:

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 |

然而,一旦我到了新年的一月,这就行不通了。在那个新年的一月,我会寻找上一年的十二月。有谁能告诉我一个更好的方法,可以覆盖一月在新的一年。谢谢不要在表的列上使用函数,这会使它们不可搜索,并且无法正确使用索引。您可以使用一个好的日期过滤器

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

查询查询的月份和年份部分是降低查询速度的一个好方法。在本例中,最好在输入参数上进行日期操作GETDATE而不是列:

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