1

我有一个存储过程,我想在 from 和 to date 之间进行搜索,但是:

if @FromDate is not null and @ToDate is not null then 
vSaleDetail.date  between @FromDate and @ToDate 

if @FromDate is not null and @ToDate is null then
vSaleDetail.date = @FromDate

if @FromDate is null and @ToDate is then
Return All

这就是我所拥有的,但它不起作用

where
(((@FromDate is null and @ToDate is null) OR  (vSaleDetail.date  between @FromDate and @ToDate ))
AND ((@FromDate is null) OR  (vSaleDetail.date = @FromDate)))

请帮忙——我需要做些什么来修复它?

4

5 回答 5

3

我会用超出您需要的范围的日期填充空参数。因此,如果表单日期为空,我将在您的数据库的日期时间数据类型中填充最早的可接受日期。To date 将填充最新的可能日期。然后,您就不需要使用所有会减慢速度的复杂逻辑。

IF @FromDate is null
Begin 
Set @Fromdate = '17530101'
END

IF @ToDATE is null
BEGIN 
SET @Todate = '99991231'
END

select ...
WHERE  vSaleDetail.date  >=@FromDate and <= @ToDate 
于 2013-05-10T18:16:36.050 回答
1

你可以试试这个:

WHERE (vSaleDetail.date BETWEEN @FromDate AND ISNULL(@ToDate,@FromDate)
    OR COALESCE(@FromDate, @ToDate) IS NULL)

ISNULL(p1, p2)

如果 p1IS NULL则返回 p2,否则返回 p1

COALESCE(p1, p2, ...)

喜欢ISNULL()。返回 p1 除非它是NULL,在这种情况下,返回 p2 除非它是NULL,在这种情况下 p3.... 如果所有参数COALESCE()都为空,NULL则返回。

于 2013-05-10T18:03:24.210 回答
0

尝试这个:

    WHERE
    ( 
        ( @FromDate IS NULL AND @ToDate IS NULL)
        OR 
        ( vSaleDetail.date BETWEEN @FromDate AND @ToDate )
    )
    OR <-- @FromDate IS NULL AND @FromDate IS NULL
( @FromDate IS NULL OR vSaleDetail.date = @FromDate )
于 2013-05-10T18:03:00.723 回答
0

AND (@DateFrom IS NULL OR CONVERT(DATETIME, [CreationDate], 103) BETWEEN CONVERT(DATETIME, @DateFrom, 103) AND DATEADD(DAY, 1, CONVERT(DATETIME, ISNULL(@DateTo, @DateFrom), 103)) )

于 2013-11-13T06:11:12.777 回答
0
declare @default_min_date datetime;
declare @default_max_date datetime;

SET @default_min_date = 0
SET @default_max_date = 2958463;

SELECT  *
FROM    MyTable
WHERE
        myDateColumn >= Isnull(@DateFrom, @default_min_date) AND myDateColumn <= Isnull(@DateTo, @default_max_date)
于 2013-05-10T18:10:15.860 回答