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 中的分组列根据日期列的最近 3 个月获取列平均值?
从十进制 (8, 0) 格式的日期获取 n-3 或 n-x 个月(约 90 天前),在 SQL Server 和 DB2 中具有年份变化影响