Одно из моих предложений WHERE следующее:

AND (DateCreated BETWEEN @DateFrom and @DateTo OR (@DateFrom IS NULL OR @DateTo IS NULL))

@DateFrom и @DateTo - входные параметры, которые могут быть NULL.

Если они оба равны нулю, то мне нужно в основном игнорировать BETWEEN и возвращать все записи.

Если @DateFrom равно NULL, но @DateTo равно NOT NULL, то мне нужно вернуть все записи с DateCreated не больше, чем @DateTo (включительно).

Если @DateFrom равно NOT NULL, но @DateTo равно NULL, то мне нужно вернуть все записи с DateCreated не ранее, чем @DateFrom (включительно) до сегодняшнего дня Дата.

DateCreated не является пустым или когда-то это пустое поле.

Пока мое предложение WHERE работает не так, как я хотел.

17
gooseman 11 Фев 2015 в 19:45

6 ответов

Лучший ответ

Просто нужны дополнительные критерии для обработки, когда один или другой NULL:

AND (
    (DateCreated >= @DateFrom and DateCreated < DATEADD(day,1,@DateTo)) 
 OR (@DateFrom IS NULL AND @DateTo IS NULL)
 OR (@DateFrom IS NULL AND DateCreated < DATEADD(day,1,@DateTo))
 OR (@DateTo IS NULL AND DateCreated >= @DateFrom)
    )

Изменить: подход Георгия был проще, здесь он адаптирован для использования с DATETIME:

AND (       (DateCreated >= @DateFrom OR @DateFrom IS NULL) 
        AND (DateCreated < DATEADD(day,1,@DateTo) OR @DateTo IS NULL)
    )

Проблема с BETWEEN или <= при использовании переменной DATE для поля DATETIME заключается в том, что любое время после полуночи последнего дня будет исключено.

'2015-02-11 13:07:56.017' больше, чем '2015-02-11' Вместо того, чтобы преобразовывать ваше поле как DATE для сравнения, для повышения производительности лучше добавить день к вашей переменной и изменить с <= на {{X4 }}.

14
Hart CO 11 Фев 2015 в 18:11
AND (DateCreated BETWEEN @DateFrom and @DateTo OR (ISNULL(@DateFrom, '')='' OR ISNULL(@DateTo, '')=''))
0
naXa 29 Дек 2018 в 01:26

Это можно просто сделать с помощью функции ISNULL.

DateCreated BETWEEN ISNULL(@DateFrom,DateCreated) AND ISNULL(@DateTo,DateCreated)
3
Zulqarnain Ejaz 16 Май 2019 в 13:26

Используйте это where clause

WHERE  ( DateCreated BETWEEN @DateFrom AND @DateTo )
        OR ( @DateFrom IS NULL
             AND @DateTo IS NULL )
        OR ( @DateFrom IS NULL
             AND DateCreated <= @DateTo )
        OR ( @DateTo IS NULL
             AND DateCreated >= @DateFrom ) 
3
Pரதீப் 11 Фев 2015 в 16:49

Как насчет:

DateCreated BETWEEN COALESCE(@DateFrom, DateCreated) AND COALESCE(@DateTo, DateCreated)
7
PRowLeR 1 Фев 2017 в 08:04

Попробуй это:

WHERE ((DateCreated >= @DateFrom OR @DateFrom IS NULL) AND (DateCreated =< @DateTo OR @DateTo IS NULL))
10
Giorgi Nakeuri 11 Фев 2015 в 16:50