Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 sql server可选参数:between子句的语法_Sql Server_Tsql - Fatal编程技术网

Sql server sql server可选参数:between子句的语法

Sql server sql server可选参数:between子句的语法,sql-server,tsql,Sql Server,Tsql,如果任何日期为空,则不显示记录。正确的语法是什么,以便在任何日期为空时获取所有记录 我想到了这一点: @FromDate datetime = null @ToDate datetime = null SELECT * FROM TABLE WHERE .... AND [PI].Date BETWEEN @FromDate AND @ToDate 谢谢。试试类似的东西 @FromDate datetime = '01/01/1901', @ToDate datetime = '12/31/

如果任何日期为空,则不显示记录。正确的语法是什么,以便在任何日期为空时获取所有记录

我想到了这一点:

@FromDate datetime = null
@ToDate datetime = null

SELECT * FROM TABLE
WHERE ....
AND [PI].Date BETWEEN @FromDate AND @ToDate
谢谢。

试试类似的东西

@FromDate datetime = '01/01/1901',
@ToDate datetime = '12/31/9999'

您可以尝试以下方法:

SELECT * FROM TABLE 
WHERE .... 
AND [PI].Date BETWEEN ISNULL(@FromDate, [PI].Date) AND ISNULL(@ToDate, [PI].Date)

HTH

您始终可以将日期值默认为某个极值,并确保使用索引:

@FromDate datetime = null
@ToDate datetime = null

SELECT * FROM TABLE
WHERE ....
AND [PI].Date BETWEEN CASE WHEN @FromDate is null THEN '01/01/1901' ELSE @FromDate END AND 
CASE WHEN @ToDate is null THEN '12/31/9999' ELSE @ToDate END
从[PI]中选择*
其中([PI].Date>=@FromDate或@FromDate为空)

和([PI].Date我不认为会使用索引,因为你这样做。@KM:你能详细说明一下吗?@Aseem Gautam,对于像我这样的查询,范围对于sql server可以解析和计划的每一行都是一个固定常量,但此查询中的范围对于每一行都可能不同(因为使用了
[PI].Date
ISNULL()中。此查询永远不会使用索引。我的版本可以使用索引。继续……例如,如果日期列是聚集主键,而您有一个大表,并且只返回几行,则我的版本将使用索引,而此查询不会。但是,如果表很小或返回的行占整个表的百分比很高,则不会使用索引在任何情况下,这永远不会使用索引,而我的索引有时也会使用。
SELECT 
    * 
    FROM TABLE 
    WHERE .... 
        AND [PI].Date BETWEEN ISNULL(@FromDate,convert(datetime,'1/1/1800'))
                          AND ISNULL(@ToDate, convert(datetime,'1/1/2500'))
SELECT * FROM [PI]
WHERE ([PI].Date >= @FromDate OR @FromDate IS NULL)
AND ([PI].Date <= @ToDate OR @ToDate IS NULL)