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

Posted

技术标签:

【中文标题】SQL server - 选择日期在上个月的所有项目【英文标题】:SQL server - Select all items with a date on the previous month 【发布时间】:2010-02-03 00:45:05 【问题描述】:

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

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

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

它还需要跨年工作(例如 12 月 - 1 月)。

有什么想法吗?

【问题讨论】:

【参考方案1】:
Select * 
  from items 
 where datefinished >= dateadd(m, datediff(m, 0, GETDATE()) - 1, 0) 
   AND datefinished < dateadd(m, datediff(m, 0, GETDATE()), 0)

【讨论】:

@gbn:很有趣,但我认为索引对范围过滤器没有帮助 根据我的经验,您通常会在此类查询的计划中获得索引搜索... @Andomar:使用 SELECT *,可能不是。但是关于 datefinished INLCUDE 输出子句的索引 = 好机会 Andomar 写道“我认为索引对范围过滤器没有帮助。” GBN 写道“使用 SELECT *,可能不会。”我写了“开发人员不能猜测。开发人员必须知道!” ;-) 设置一个测试,看看你确实得到了一个 INDEX SEEK。是的,我同意您将使用 SELECT * 获得“密钥查找”,但 SELECT * 不会阻止您获得 INDEX SEEK。而且,是的,Andomar,它确实有助于范围过滤器。 ;-)【参考方案2】:

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

这应该可以跨年工作,如果查询是在比月初更晚的一天运行的。

【讨论】:

【参考方案3】:

简单就用我刚刚用的:DATEDIFF(mm,dateFinished,GETDATE()) = 1

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

【讨论】:

【参考方案4】:

我将首先检查 DATEADD 函数 http://msdn.microsoft.com/en-us/library/ms186819.aspx

【讨论】:

以上是关于SQL server - 选择日期在上个月的所有项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中获取上个月的昨天日期?有人可以帮我解决这个问题吗?

在 SQL Server 中创建自定义日期范围列表以便于使用

在 SQL Server 2008 中计算到期日期

如何通过 SQL Server 中的分组列根据日期列的最近 3 个月获取列平均值?

从十进制 (8, 0) 格式的日期获取 n-3 或 n-x 个月(约 90 天前),在 SQL Server 和 DB2 中具有年份变化影响

SQL Server 查询以查找间隔或 12 个月或更长时间的记录