当我在我的桌子上运行where where子句时,我得到2个不同的结果,对我而言,我似乎应该得到相同数量的记录。
我只使用一个静态日期进行测试,另一个也应该检索相同的结果,我试图获得上个月的结果
我认为查询是一个自动加载前几个月记录的报告。
WHERE
(OrderReceiptedDate >= '2015-03-01')
AND (OrderReceiptedDate <= '2015-03-31')
WHERE
(DATEPART(mm, OrderReceiptedDate) = DATEPART(mm, DATEADD(mm, - 1, GETDATE())))
AND
(DATEPART(yy, OrderReceiptedDate) = DATEPART(yy, DATEADD(mm, - 1, GETDATE())))
答案 0 :(得分:1)
这是两个陈述
WHERE (OrderReceiptedDate >= '2015-03-01' AND
OrderReceiptedDate <= '2015-03-31'
)
WHERE (DATEPART(month, OrderReceiptedDate) = DATEPART(month, DATEADD(month, - 1, GETDATE()))) AND
(DATEPART(year, OrderReceiptedDate) = DATEPART(year, DATEADD(month, - 1, GETDATE())))
鉴于今天是2015年4月,您预计这两个日期都将在3月份完成。并且,如果您的日期没有时间组件,他们会。问题是3月31日的几乎任何日期时间都不符合第一个条件。唯一的例外是午夜:2015-03-01 00:00:00.000。
第一个写得更好:
WHERE (OrderReceiptedDate >= '2015-03-01' AND
OrderReceiptedDate < '2015-04-01'
)
写“让我上个月约会”的更好方法是:
WHERE OrderReceiptedDate >= dateadd(month, -1, cast(getdate() - day(getdate()) + 1 as date)) and
OrderReceiptedDate < cast(getdate() - day(getdate()) + 1 as date)
这会对getdate()
执行所有计算,因此查询仍然可以利用OrderReceiptDate
上的索引。