Одно из моих предложений 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
работает не так, как я хотел.
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 }}.
AND (DateCreated BETWEEN @DateFrom and @DateTo OR (ISNULL(@DateFrom, '')='' OR ISNULL(@DateTo, '')=''))
Это можно просто сделать с помощью функции ISNULL.
DateCreated BETWEEN ISNULL(@DateFrom,DateCreated) AND ISNULL(@DateTo,DateCreated)
Используйте это 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 )
Как насчет:
DateCreated BETWEEN COALESCE(@DateFrom, DateCreated) AND COALESCE(@DateTo, DateCreated)
Попробуй это:
WHERE ((DateCreated >= @DateFrom OR @DateFrom IS NULL) AND (DateCreated =< @DateTo OR @DateTo IS NULL))
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.