Sql Server оператор SELECT с «плохим» условием даты - PullRequest
3 голосов
/ 13 июля 2011

Скажите, если мне нужно выбрать записи из базы данных, где поле даты находится в определенном периоде времени.Запрос на выборку будет выглядеть так:

SELECT * FROM [MyTable] WHERE [Date] >= @RangeBegin AND [Date] <= @RangeEnd;

Но у меня есть небольшое условие, когда поле Date может быть пустым или недействительным.В этом случае значение даты должно быть взято из @ DefaultDate.

Как поместить все это в SQL?

Ответы [ 4 ]

4 голосов
/ 13 июля 2011

Поскольку вы говорите, что дата может быть недействительной, я предполагаю, что вы сохранили даты как varchar. Вы можете использовать isdate , чтобы проверить правильность даты.

select case isdate([Date]) 
         when 1 then cast([Date] as datetime)
         else @DefaultDate 
       end as [Date]
from MyTable
where case isdate([Date]) 
        when 1 then cast([Date] as datetime)
        else @DefaultDate 
      end between @RangeBegin and @RangeEnd
2 голосов
/ 13 июля 2011
SELECT CASE WHEN ([Date] IS NULL) THEN @DefaultDate ELSE [Date] END AS [Date]
FROM [MyTable]
WHERE ([Date] >= @RangeBegin AND [Date] <= @RangeEnd) OR ([Date] IS NULL)
2 голосов
/ 13 июля 2011

Я не вижу, как поле Date может быть недействительным.Но для нулевого значения вы можете сделать следующее:

SELECT * 
FROM [MyTable] 
WHERE (     [Date] IS NOT NULL 
        AND [Date] >= @RangeBegin AND [Date] <= @RangeEnd
      )
OR    (     [Date] IS NULL 
        AND @DefaultDate >= @RangeBegin AND @DefaultDate <= @RangeEnd
      )
0 голосов
/ 14 января 2012

выберите случай, когда isdate ([Date]) = 0 затем @DefaultDate else [Date] end от ... где Date между @RangeBegin и @RangeEnd или isdate ([Date]) = 0

Оператор case в предложении where следует по возможности избегать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...