SQL server-选择日期在上个月的所有项目

SQL server-选择日期在上个月的所有项目,sql,sql-server,tsql,datetime,Sql,Sql Server,Tsql,Datetime,我的SQL Server数据库中有一个名为“items”的表,其中有一列名为“dateFinished” 我有一个脚本,将在每个月的第一天运行,它需要选择在上个月完成的所有项目 因此,例如,在2月1日,它需要选择dateFinished大于或等于1月1日00:00且小于2月1日00:00的所有项目 它还需要在新的一年中工作(例如12月至1月) 有什么想法吗?选择* Select * from items where datefinished >= dateadd(m, dated

我的SQL Server数据库中有一个名为“items”的表,其中有一列名为“dateFinished

我有一个脚本,将在每个月的第一天运行,它需要选择在上个月完成的所有项目

因此,例如,在2月1日,它需要选择dateFinished大于或等于1月1日00:00且小于2月1日00:00的所有项目

它还需要在新的一年中工作(例如12月至1月)

有什么想法吗?

选择*
Select * 
  from items 
 where datefinished >= dateadd(m, datediff(m, 0, GETDATE()) - 1, 0) 
   AND datefinished < dateadd(m, datediff(m, 0, GETDATE()), 0)
从项目 其中datefinished>=dateadd(m,datediff(m,0,GETDATE())-1,0) 和datefinished
我首先要检查DATEADD函数

您可以使用
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()))

这应该可以跨年使用,如果查询运行的日期晚于一个月的第一天,也可以这样做。

简单地使用我刚才使用的方法:
DATEDIFF(mm,dateFinished,GETDATE())=1

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

@gbn:很有意思,但我不认为索引对范围过滤器有帮助。根据我的经验,你通常会在这类查询的计划中得到索引搜索…@Andomar:with SELECT*,可能不会。但是datefinished INLCUDE output子句=good chanceAndomar的索引写道:“我认为索引对范围过滤器没有帮助。”GBN写道“使用SELECT*,可能没有。”我还写道“开发人员不能猜测。开发人员必须知道!”;-)设置一个测试,看看你是否真的得到了一个索引搜索。是的,我同意您将使用SELECT*获得“键查找”,但SELECT*没有任何东西会阻止您获得索引查找。而且,是的,安多玛,它确实有助于范围过滤器