Использование предложения WHERE с МЕЖДУНАРОДНЫМИ и нулевыми параметрами даты

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

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

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

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

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

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

DateCreated не является нулевым или некоторое время это нулевое поле.

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

Ответ 1

Просто нужны дополнительные критерии для обработки, когда один или другой 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)
    )

Изменить: подход Giorgi был проще, здесь он адаптирован для использования с 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 для сравнения, лучше для производительности добавить день к вашей переменной и изменить от <= до <.

Ответ 2

Попробуйте следующее:

WHERE ((DateCreated >= @DateFrom OR @DateFrom IS NULL) AND (DateCreated =< @DateTo OR @DateTo IS NULL))

Ответ 3

Как насчет:

DateCreated BETWEEN COALESCE(@DateFrom, DateCreated) AND COALESCE(@DateTo, DateCreated)

Ответ 4

Используйте 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 ) 

Ответ 5

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

DateCreated BETWEEN ISNULL(@DateFrom,DateCreated) AND ISNULL(@DateTo,DateCreated)

Ответ 6

AND (DateCreated BETWEEN @DateFrom and @DateTo OR (ISNULL(@DateFrom, '')='' OR ISNULL(@DateTo, '')=''))