代码之家  ›  专栏  ›  技术社区  ›  Ryan Gadsdon

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

  •  2
  • Ryan Gadsdon  · 技术社区  · 6 年前

    Fiddle: 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 |
    

    然而,一旦我到了新年的一月,这就行不通了。在那个新年的一月,我会寻找上一年的十二月。有谁能给我建议一个更好的方法,可以在新的一年中涵盖一月。谢谢

    2 回复  |  直到 6 年前
        1
  •  3
  •   Larnu    6 年前

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

    SELECT *
    FROM Table1
    WHERE [Date] >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1,0)
      AND [date] < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0);
    
        2
  •  1
  •   EzLo tumao kaixin    6 年前

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

    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