SQL服务器 - 选择所有上个月有日期的项目

4
我在我的SQL Server数据库中有一个名为“items”的表格,其中有一列名为“dateFinished”。
我有一个脚本,每个月的第一天运行,需要选择上个月完成的所有项目。
例如,在2月1日,它将需要选择所有日期在1月1日00:00及以后且小于2月1日00:00的项目。
此外,它还需要跨年度工作(例如DEC - JAN)。
有什么想法吗?
4个回答

8
Select * 
  from items 
 where datefinished >= dateadd(m, datediff(m, 0, GETDATE()) - 1, 0) 
   AND datefinished < dateadd(m, datediff(m, 0, GETDATE()), 0)

@gbn:有趣,但我认为索引无法帮助范围过滤。 - Andomar
1
根据我的经验,在这种类型的查询计划中通常会得到一个索引查找。 - Matt Whitfield
@Andomar:使用SELECT *,可能不会。但是在datefinished上建立索引,并包含输出子句=很有机会。 - gbn
2
Andomar写道:“我认为索引对于范围过滤器没有帮助。” GBN写道:“用SELECT *,可能不行。”而我写道:“开发人员不能猜测。开发人员必须知道!”; - )设置一个测试并确保您实际获得INDEX SEEK。 是的,我同意您将通过SELECT *获得“关键查找”,但是SELECT *并不会阻止您获得INDEX SEEK。 是的,Andomar,它对范围过滤器有所帮助。 ;-) - Jeff Moden

7

您可以使用dateadd(m,-1,getdate())来获取上个月的日期。然后,在where子句中过滤该日期的年份和月份,例如:

select *
from items
where datepart(yy,dateFinished) = datepart(yy,dateadd(m,-1,getdate()))
and datepart(m,dateFinished) = datepart(m,dateadd(m,-1,getdate()))

这应该可以跨越年份,而且即使在月初之后运行查询也可以。


1

简单来说,只需使用我刚才用过的代码:DATEDIFF(mm,dateFinished,GETDATE()) = 1

SELECT * 
FROM items 
WHERE DATEDIFF(mm,dateFinished,GETDATE()) = 1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接