检索上个月的数据,上个月也是去年?

时间:2018-01-02 13:49:51

标签: sql

我在几个查询中有以下Where子句。这成功检索了过去几个月的数据。现在这一年已经改变,查询无法找到任何数据(2018年12月还没有发生!)。如何更改Where子句以克服这个问题?

select *
from somedatabase a
WHERE DATEPART(m, a.meetDate) = DATEPART(m, DATEADD(m, -1, getdate()))
  and DATEPART(yyyy, a.meetDate) = DATEPART(yyyy, getdate())

非常感谢和非常感谢的任何帮助。

2 个答案:

答案 0 :(得分:1)

我向下舍入到当月开始的正常方式是:

  • DATEADD(month, DATEDIFF(month, 0, getDate()), 0)
    • 了解自0日起整个月份的数量
    • 然后添加许多个月到目前为止
    • 始终给出月份的开头(因为日期0是一个月的开始)
    • 不受闰年,年界,各种长度的月份等影响


这允许我做像......这样的事情。

WHERE
      a.meetDate >= DATEADD(month, DATEDIFF(month, 0, getDate()) - 1, 0)  -- start of last month
  AND a.meetDate <  DATEADD(month, DATEDIFF(month, 0, getDate())    , 0)  -- start of this month

通过在右侧进行计算,您可以最大限度地利用索引。

答案 1 :(得分:0)

这是一种方式:

WHERE DATEPART(month, a.meetDate) = DATEPART(month, DATEADD(m, -1, getdate())) AND
      DATEPART(year, a.meetDate) = DATEPART(year, DATEADD(m, -1, getdate()))

即两次比较减去一个月。

实际上,更简单的方法是使用DATE_DIFF()的奇怪规则:

WHERE DATEDIFF(month, a.meetDate, getdate()) = 1

这些都不能使用索引。为此,表达式稍微复杂一些:

WHERE a.meetDate >= DATEFROMPARTS(YEAR(DATEADD(MONTH, -1, GETDATE()),
                                  MONTH(DATEADD(MONTH, -1, GETDATE()),
                                  1) AND
      a.meetDate < DATEADD(DAY, 1 - DAY(GETDATE()), CAST(GETDATE() as DATE))