Использование предложения 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, '')=''))