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)