从Sql server中的where子句中排除函数

bms*_*dev 4 sql t-sql sql-server stored-procedures sql-server-2012

我在下面query的一个用过stored procedures

SELECT officeid, rdate
FROM dbo.mytable
Where OfficeID   = OfficeID
  AND YEAR(h.rDate) = @year
  AND MONTH(h.rDate) BETWEEN 1 AND 4
Run Code Online (Sandbox Code Playgroud)

上述查询无法成为SARG ( Search Argument)由于功能的使用MONTHYEAR导致的Where clause.这导致执行Index scan期间stored procedure.有没有办法重写上面的查询来处理上述逻辑(没有function)

(PS: rdatedatetimedatetype,@yearINT数据类型)

The*_*war 5

使用伪值..

以下功能是SARGABLE(但会很长),因为,所以将使用索引. CAST( DATETIME to DATE) is SARAGABLE

例:

Cast(h.rDate as DATE) 
between datefromparts(@year,01,01) 
 and datefromparts(@year,04,30)
Run Code Online (Sandbox Code Playgroud)