我在几个查询中有以下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())
非常感谢和非常感谢的任何帮助。
答案 0 :(得分:1)
我向下舍入到当月开始的正常方式是:
DATEADD(month, DATEDIFF(month, 0, getDate()), 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))