2016-12-06 1 views
0

У меня есть таблица с людьми, inactive-flag (бит), указывающая активный/неактивный и fromdate, todate.SQL Server: WHERE Предложение об исключении данных при выборе

  • a) Неактивный = 1 указывает, что кто-то вообще «неактивен». Если есть дата в поле fromdate и todate, это означает, что в целом он не активен EXCEPT в течение этого периода.

  • b) Неактивный = 0 указывает, что кто-то является общим «активным». Если есть дата в поле fromdate и todate, это означает, что в целом он активен EXCEPT в течение этого периода.

  • c) Последний вариант - это лица, у которых есть только неактивные = 0, без исключения даты (fromdate и todate - NULL).

Я хочу отфильтровать всех лиц a) и c), за исключением b).

Я пробовал много, но не смог решить проблему.

Я нашел решение для a) и c), но не для b). я пытался для б):

WHERE inaktiv=0 AND (Not (fromdate >=convert(date,getdate()) AND todate <=convert(date,getdate()))) 
+0

вы можете использовать «союз» с несколькими избранными статусами –

+0

почему вы хотите b) случаи, если вы хотите только a) и c) случаи? –

+0

Вы забыли 'или Неактивно = 1'. Также путаное отрицание сравнения с датой может быть абсолютно ясным '(fromdate <@date и todate> @date)' –

ответ

0

Чтобы получить а) и в) случаях:

WHERE inaktiv=1 OR (inaktiv=0 AND fromdate IS NULL AND todate IS NULL) 
+0

Оба, fromdate и todate имеют даты, поэтому todate не может быть NULL. Я должен проверить оба срока. Моя проблема - б). а) и в). – mak

0

Я думаю, что я сделал это после многих испытаний:

WHERE ((inaktiv=0 and (not (convert(date,getdate()) between aktivVon AND aktivBis)))) 
or ((inaktiv=0) and (aktivVon is null AND aktivBis is null)) 
or ((inaktiv=1 and (convert(date,getdate()) between aktivVon AND aktivBis))) 

последняя строка б). Пожалуйста, подтвердите свое решение, я надеюсь, что ничего не забыл. Michael

Смежные вопросы