Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Sql server中的where子句中排除函数_Sql_Sql Server_Tsql_Stored Procedures_Sql Server 2012 - Fatal编程技术网

从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以避免任何本地化问题,则效果会更好。