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

时间:2018-06-06 09:56:21

标签: sql 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月,我将寻找前一年的12月。任何人都可以建议我使用更好的方法来覆盖Jan在新的一年。感谢

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

不要在表的列上使用函数(它使它们成为非SARGable并且无法正确使用索引)。你可以使用一个好的日期过滤器。

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