Назначьте значение datetime, если параметр datetime имеет значение null - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть отчет SSRS, в котором, помимо прочего, указаны параметры даты начала и окончания.Для даты начала и окончания можно установить параметр NULL.Правило состоит в том, что если дата начала равна нулю, то полученные данные начинаются с начала времени.Если конечная дата равна нулю, то она устанавливается на сегодняшнюю дату.Вот что я пытаюсь сделать здесь:

SELECT * 
FROM mytab 
WHERE (Start >= CASE @From 
                   WHEN NULL 
                      THEN DATEADD(year, -100, @From)
                END) 
  AND (End <= CASE @To
                 WHEN NULL THEN GETDATE()
              END)

В качестве теста я объявляю переменные @From и @To в своем запросе, устанавливаю их в NULL и запускаю в SSMS.

Я хочу сказать, что если @From равно нулю, установить значение 100 лет назад и сравнить его с полем mytab «Пуск».Аналогично, если @To равно нулю, установите его на сегодняшнюю дату и сравните с «Конец».Однако это не возвращает никаких данных.Это явно неправильно, так как правильно это сделать?

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

A simple case выражение * Предложение 1006 * не может соответствовать null, но вы можете проверить его, используя is null в искали case: case when @From is NULL then Cast( '1900-01-01' as Date ) else @From end. Обратите внимание, что предложение else предоставляет значение, если ни одно из предложений when не соответствует.

Более подходящее решение для вашей проблемы - использовать Coalesce:

select *
  from MyTab
  where Coalesce( @From, Cast( '1900-01-01' as Date ) ) <= [Start] and
    [End] <= Coalesce( @To, Cast( GetDate() as Date ) );

Обратите внимание, что значение приводится к date, чтобы исключить время суток.

0 голосов
/ 12 сентября 2018

Здесь нет необходимости использовать операторы CASE, поскольку мы можем использовать ISNULL или COALESCE.

SELECT * 
FROM mytab 
WHERE Start >= ISNULL( @From , DATEADD(year, -100, GETDATE()) ) 
  AND End   <= ISNULL( @To   , GETDATE() )
0 голосов
/ 12 сентября 2018

Синтаксис CASE не разрешает значения NULL так, как вы хотите.

DECLARE @TEST AS VARCHAR(10)

SET @TEST = NULL

SELECT CASE WHEN @TEST IS NULL THEN 1 ELSE 0 END AS TEST1, 
       CASE @TEST WHEN NULL THEN 1 ELSE 0 END AS TEST2

Результат равен 1 для TEST1 и 0 для TEST2 - не 1 и 1, как ожидалось.

SELECT * from mytab WHERE (Start >= CASE WHEN @From IS NULL THEN DATEADD(year, -100, @From) END) 

AND (End <= CASE WHEN @To IS NULL THEN GETDATE() END)
...