sql - 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 不是一个选项。
解决方案
似乎你所追求的是这样的:
WHERE YourDateColumn < DATEADD(DAY, 1, EOMONTH(GETDATE()))
AND YourDateColumn >= DATEADD(DAY, 1, EOMONTH(GETDATE(),-2))
对于今天,这将为您提供before 2020-02-01
和on 或 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)
推荐阅读
- python - 使用自定义变量/内存清单迭代 -hosts 行(ansible)
- postgresql - 需要在 rhel 7.9 中创建 pcs cluster postgresql 的 DC & DR 设置
- c# - 如何为一天中的特定时间安排活动
- flutter - Geolocator.getServiceStatusStream() 没有定义?
- c# - 请求清单文件中声明的所有权限
- docker - Windows 上的 Gitlab docker runner:msbuild 失败
- python - Python:计算曲线下的面积
- cookies - 当页面由第三方网站初始化时,Request.Cookies 不起作用
- reactjs - 反应:在 useEffect 中更新状态而不超过最大更新深度
- python - 我应该在哪里存储我的 python 程序找到的文件的路径?