从Sql server中的where子句中排除函数
我在我的一个从Sql server中的where子句中排除函数,sql,sql-server,tsql,stored-procedures,sql-server-2012,Sql,Sql Server,Tsql,Stored Procedures,Sql Server 2012,我在我的一个存储过程中使用了下面的查询 SELECT officeid, rdate FROM dbo.mytable Where OfficeID = OfficeID AND YEAR(h.rDate) = @year AND MONTH(h.rDate) BETWEEN 1 AND 4 由于在Where子句中使用了功能MONTH和YEAR,上述查询无法成为SARG(搜索参数)。这将导致在执行存储过程期间进行索引扫描。有没有办法重写上述查询以处理上述逻辑(没有函数) (注意:r
存储过程中使用了下面的查询
SELECT officeid, rdate
FROM dbo.mytable
Where OfficeID = OfficeID
AND YEAR(h.rDate) = @year
AND MONTH(h.rDate) BETWEEN 1 AND 4
由于在Where子句
中使用了功能MONTH
和YEAR
,上述查询无法成为SARG(搜索参数)
。这将导致在执行存储过程期间进行索引扫描。有没有办法重写上述查询以处理上述逻辑(没有函数
)
(注意:rdate
是datetime
日期类型,@year
是INT
数据类型)使用伪值
下面的函数是可搜索的(但会很长),因为,所以将使用索引
示例:
Cast(h.rDate as DATE)
between datefromparts(@year,01,01)
and datefromparts(@year,04,30)
使用日期范围比较。比如说,
SELECT officeid, rdate
FROM dbo.mytable
Where OfficeID = OfficeID
--Filter by dates that are between January 1st, midnight, inclusive, and
--May 1st, exclusive, in the desired year
AND h.rDate >= Convert(DateTime,'1/1/' + Convert(VarChar(4),@year))
AND h.rDate < Convert(DateTime,'5/1/' + Convert(VarChar(4),@year))
选择officeid,rdate
从dbo.mytable
其中OfficeID=OfficeID
--按介于1月1日、午夜(含午夜)和
--所需年份的5月1日,独家
和h.rDate>=Convert(日期时间,'1/1/'+Convert(VarChar(4),@year))
和h.rDate
您可以更改参数吗?如果你可以传递一个日期参数而不是一个int,那就简单多了。当然,传递一个日期仍然可以,但是传递一个日期要干净得多。不,实际上,SSRS报告中使用了这个存储过程@year参数来自year Combo如果您将日期字符串切换为符合ANSI标准的yyyy mm dd以避免任何本地化问题,则效果会更好。