首页 > 解决方案 > SQL 仅获取本月和上月的日期范围

问题描述

我试图仅从本月和上个月提取数据,但是当日期跨越一年时,我感到有些困惑。例如,我的初始查询只是从中提取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 不是一个选项。

标签: sqlsql-servertsqlsql-server-2008

解决方案


似乎你所追求的是这样的:

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

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

MONTH(YourDateColumn) = MONTH(GETDATE())编辑:您也应该避免使用类似的表达式WHERE。这样做会创建一个非 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)

推荐阅读