Sql 使用sargable查询查找任何月份最后一天下的订单?

Sql 使用sargable查询查找任何月份最后一天下的订单?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我写这个查询是为了查找任何月份最后一天下的订单 我知道如果orderdate已编制索引,则不建议使用此方法。我应该使用什么方法使其可销售 select o.orderid, o.orderdate, o.custid, o.empid from sales.Orders o where day(o.orderdate) in (30, 31) or (month(o.orderdate) = 02 and day(o.orderdate)= 28) or

我写这个查询是为了查找任何月份最后一天下的订单

我知道如果orderdate已编制索引,则不建议使用此方法。我应该使用什么方法使其可销售

select o.orderid, o.orderdate, o.custid, o.empid
from  sales.Orders o
where day(o.orderdate) in (30, 31) 
         or (month(o.orderdate) = 02 and day(o.orderdate)= 28) 
         or (month(o.orderdate) = 02 and day(o.orderdate)= 29);

此查询将在闰年失败,因为它将为您提供2个日期作为2月份的最后一天。要使其可搜索,您需要删除日期列上的函数。

这应该可以正常工作

select o.orderid, o.orderdate, o.custid, o.empid
from  sales.Orders o
where
day(o.orderdate)=day(DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0,o.orderdate) + 1, 0)))
下面的查询给出了当前月份的最后一天,将getdate()替换为date变量,如上图所示:

SELECT day(DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) + 1, 0)))

DATEADD
可搜索:

WHERE DATEADD(day, DATEDIFF(day, 0, o.orderdate), 0) = 
      DATEADD(day, -1, DATEADD(month, DATEDIFF(month, 0, o.orderdate) + 1, 0)) 
第一种是从
datetime
截断时间的老方法。第二个加上一个月,“截断”该月并减去一天


使用相同的“技巧”返回当前月份的最后一天的小提琴。您可以使用计算列执行此操作:

alter table Orders add column nextdayofmonth as day(dateadd(day, 1, orderdate));

create index orders_nextdayofmonth on orders(orders_nextdayofmonth);
下一个月的第二天是闰年,所以闰年很容易处理。毕竟,“最后一天”的第二天是下个月的“第一天”

然后将您的查询表述为:

where next_dayofmonth = 1
此表达式是可搜索的。

您还可以执行以下操作:

select TOP 1 orderid, orderdate, custid, empid
from  sales.Orders 
ORDER BY orderdate DESC

获取当天的所有日期明天的一部分是1:

SELECT *
FROM Sales.Orders
WHERE DAY(DATEADD(dd, 1, orderdate)) = 1

@t-clausen.dk是“=”不可搜索?@Punter015在
WHERE
子句中的函数中放置列是不可搜索的。你能解释一下这部分
DATEADD(d,-1,DATEADD(m,DATEDIFF(m,0,o.orderdate)+1,0)吗?
我不明白+1在这里是如何工作的。