【问题标题】:SQL getting date ranges from this month and last month onlySQL 仅获取本月和上月的日期范围
【发布时间】:2020-01-02 11:35:25
【问题描述】:

我试图仅从本月和上个月提取数据,但当日期跨越一年时,我有点困惑。 例如,我的初始查询只是从 Month(getdate()) and Month(getdate())-1 提取数据,这在这一年中运行良好,但是,由于今天是 2020 年 1 月 2 日,我的查询没有返回 2019 年 12 月的任何内容(显然,Month(getdate())-1 等于零) .

我现在将 where 子句更改为...

where Month(InstrDate) in  (MONTH(getDate()),Month(DATEADD(month, -1, getdate()))) 
and year(InstrDate) in  (year(getDate()),year(DATEADD(YEAR, -1, getdate())))

...现在这个月可以正常工作,但我想知道当“本月”和“上个月”在同一年内时下个月会发生什么。

我认为where 子句可以,因为它将返回(例如)今年和去年的二月和一月(?)但我认为我的案例陈述将不起作用,因为它将包括这两年。 .

case 
when month(Instrdate) = Month(getdate()) and year(Instrdate) = year(getdate()) then 'This Month'
when month(Instrdate) = Month(DATEADD(month, -1, getdate())) and year(Instrdate) = year(DATEADD(year, -1, getdate()))then 'Last Month'
end as 'Month',

当然,我的“上个月”行将始终返回去年的上个月....如何确保它始终返回当前月份的前一个月?

更新:数据库是 SQL 2008 - 因此 EOMONTH 不是一个选项。

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008


    【解决方案1】:

    看来你要的是这样的:

    WHERE YourDateColumn < DATEADD(DAY, 1, EOMONTH(GETDATE()))
      AND YourDateColumn >= DATEADD(DAY, 1, EOMONTH(GETDATE(),-2))
    

    对于今天,这将为您提供之前 2020-02-01on 或之后 2019-12-01 的所有行。

    编辑:您也应该避免在 WHERE 中使用像 MONTH(YourDateColumn) = MONTH(GETDATE()) 这样的表达式。这样做会创建一个非 SARGable 查询,因此任何索引对 RDBMS 来说都是无用的,因为在列上使用了 MONTH 函数。坚持“正确的”日期逻辑。


    正如 OP 现在建议他们使用的是不支持版本的 SQL Server,那么将无法使用 EOMONTH。但是,您可以使用DATEADD 技术:

    WHERE YourDateColumn < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+1,0)
      AND YourDateColumn >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1,0)
    

    【讨论】:

    • 我认为 SQL 服务器必须早于 2012 年,因为我得到“EOMONTH 不是一个可识别的函数”(我会更新问题)。
    • 当您提出问题@dazzathedrummer 时,强烈 假定您正在使用受支持的软件。如果你不是,你应该警告人们,并标记不受支持的软件。
    • 是的,很抱歉,这不是我经常使用的数据库,它很快就会被淘汰。我只是在尝试运行 EOMONTH 时才发现版本问题。
    • 我已经用一个解决方案更新了答案,适用于旧的、不受支持的 SQL Server 版本,@dazzathedrummer。但是,理想情况下,您应该尽快考虑升级路径。
    【解决方案2】:

    获取上个月数据的最简单方法是:

    where datediff(month, Instrdate, getdate()) = 1
    

    即日期和当前日期之间有一个月的界限。

    这种方法的缺点是它不能在Instrdate 上使用索引。也就是说,它不是sargable

    另一种方法是:

    where instrdate < convert(date, dateadd(day, 1 - day(getdate()), getdate())) and
          instrdate >= dateadd(month, -1, convert(date, dateadd(day, 1 - day(getdate()), getdate())))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 2020-11-10
      相关资源
      最近更新 更多