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

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

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

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

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

有什么想法吗?

【问题讨论】:

    标签: sql sql-server tsql datetime


    【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-31
          • 2016-08-24
          • 1970-01-01
          • 2012-03-30
          • 2015-12-25
          • 2017-07-19
          相关资源
          最近更新 更多