2016-04-07 2 views
1

У меня есть таблица клиентовSQL Server - выяснить, активных клиентов в заданном диапазоне дат

TBLCustomer:

CustomerCode StartDate EndDate 
----------------------------------------- 
C1    2016-02-01 2016-05-01 
C2    2016-05-01 2016-12-01 
C3    NULL   2016-05-01 
C4    2016-07-01 NULL 
C5    NULL   NULL 

Теперь я хочу написать запрос, чтобы узнать клиентов, которые активны на текущую дату на следующих условиях.

  1. Если начальная и конечная дата не пустые, тогда клиент активен между заданным диапазоном дат.

  2. Если дата начала NULL и дата окончания, то клиент активен до конца.

  3. Если дата начала и дата окончания равна NULL, тогда клиент активен с начала.

  4. Если дата начала и окончания NULL, клиент всегда активен.

Пример вывода:

Текущая дата: 2016-04-07

CustomerCode  
---------------- 
C1    
C3    
C5    

Пожалуйста, ответьте. Благодарю.

+0

после некоторых выходных данных на основе приведенной выше таблицы – TheGameiswar

+0

почему c2 и c3 исключены, вы должны опубликовать некоторые примеры того, почему вы исключаете их и что является причиной, включая отдых – TheGameiswar

ответ

0

Одним из способов реализации вашей логики является использование функции COALESCE() на StartDate и EndDate. В случаях, когда StartDate будет NULL, вы можете заменить его на очень раннюю дату (1753 год в моем примере ниже). Затем, если отсутствует StartDate, клиент будет эффективно обрабатываться так, как если бы он всегда был там. Я применяю аналогичную логику для EndDate.

SELECT t.* 
FROM TBLCustomer t 
WHERE someDate BETWEEN COALESCE(StartDate, CAST('1753-1-1' AS DATETIME)) AND 
         COALESCE(EndDate, CAST('9999-12-31' AS DATETIME)) 
0

Вы могли бы просто обеспечить ISNULL с датой, которая будет хорошо до/после границ:

т.е..

WHERE @ActiveDate BETWEEN ISNULL(StartDate, '1900-01-01') AND ISNULL(EndDate, '2100-01-01') 
Смежные вопросы