以下是我的 SP :
Alter PROCEDURE GetList
(
@FromDate date = null,
@ToDate date = null
)
AS
Select * FROM CallList c
Where c.CallDate > @FromDate and c.CallDate < @ToDate
如果没有通过日期过滤器,我想获取所有记录。
我该怎么办?
答案 0 :(得分:14)
你可以这样做:
SELECT * FROM CallList c
WHERE (c.CallDate > @FromDate OR @FromDate IS NULL) AND
(c.CallDate < @ToDate OR @ToDate IS NULL)
这也让你可以将其中一个日期留空而不是另一个日期。
答案 1 :(得分:6)
你会做以下
SELECT *
FROM CallList AS C
WHERE (@FromDate IS NULL OR c.CallDate > @FromDate)
AND (@ToDate IS NULL OR c.CallDate < @ToDate)
答案 2 :(得分:3)
一些可行的选择:
您可以将@FromDate
和@ToDate
分别设置为非常早或非常晚的日期,它们都是NULL。
您可以使用sp_executesql并根据需要构建带有参数的动态查询字符串,例如
DECLARE @Sql NVARCHAR(MAX) = 'SELECT * FROM CallList C WHERE 1 = 1 '
IF @FromDate IS NOT NULL
BEGIN
SET @Sql += ' AND C.CallDate > @xFromDate'
END
IF @ToDate IS NOT NULL
BEGIN
SET @Sql += ' AND C.CallDate < @xToDate'
END
EXEC sp_executesql @Sql, N'@xFromDate DATETIME, @xToDate DATETIME', @xFromDate = @FromDate, @xToDate = @ToDate
后一种方法比在整个地方使用OR更好,因为包含OR的查询总是最终得到非常好的优化 - 它们可能适用于某些参数集,但通常不是一刀切的
答案 3 :(得分:2)
尝试以下方法:
SELECT
*
FROM
CallList c
WHERE
( @FromDate is null AND @ToDate is null ) OR
( @FromDate is null AND c.CallDate < @ToDate ) OR
( @ToDate is null AND c.CallDate > @FromDate) OR
( c.CallDate > @FromDate AND c.CallDate < @ToDate )
此外,如果您正在寻找两个时期之间的交集,请不要忘记选择以后的 FromDate 和之前的 ToDate 。
答案 4 :(得分:2)
每次动态sql都是complie,所以要防止使用动态sql
select * from calllist As c
where (c.CallDate < @ToDate or @ToDate is null)
and (c.CallDate > @FromDate or @FromDate is null)
答案 5 :(得分:0)
DECLARE @BgnDate date,
@EndDate date
SELECT @BgnDate = MIN(c.CallDate), @EndDate = MIN(c.CallDate) FROM CallList
Select * FROM CallList c
Where c.CallDate > ISNULL(@FromDate,@BgnDate)
and c.CallDate < ISNULL(@ToDate,@EndDate)
答案 6 :(得分:0)
你也可以使用BETWEEN
(短手小于或等于,大于或等于):
declare @ToDate varchar(12)=null,
@FromDate varchar(12)=null
select * from calllist As c where c.CallDate between
CONVERT(datetime, isnull(@ToDate,c.CallDate))
and CONVERT(datetime,isnull(@FromDate,c.CallDate))