У меня есть следующая таблица:
Человек
UserID Name Date_Joined Date_Left
1 Test 2018-08-10 NULL
2 Test2 2018-07-10 NULL
3 Test3 2018-07-10 2018-12-31
4 Test4 2018-08-10 2018-09-10
Я хочу проверить только по дате их присоединения и / или выхода, являются ли они оплачиваемыми (= активными) или нет.
Это платные пользователи:
Пользователь, у которого начальный месяц как минимум за месяц до даты выставления счета, без даты
Пользователь, у которого начальный месяц по крайней мере за один месяц до billdate с оставшейся датой, месяц, равный billdate или позже, чем billdate
Месяц выставления счета = всегда предыдущий месяц.
Я использую следующий запрос:
DECLARE @billdate AS DATE = '2018-09-01';
SELECT *
FROM person
WHERE CompanyID = 1205 AND (
(
date_joined <= EOMONTH(@billdate, -1)
)
OR
(
date_left > EOMONTH(@billdate, -1) AND
date_left <= EOMONTH(@billdate)
)
)
Мои проблемы:
- Пользователь Test4 все еще присутствует в моей таблице, если я установил дату счета
2018-11-01
. - Пользовательский Test3 исчезает, если я установил для billdate значение
2019-01-01
Что не так с моим запросом и как его оптимизировать?
Примеры данных:
Список пользователей:
1 - Тест - 10.08.2018 - ПУСТО
2 - Test2 - 10.07.2018 - NULL
3 - Test3 - 10.07.2018 - 31.12.2018
4 - Test4 - 10.08.2018 - 10.09.2018
За расчетный период предыдущего месяца (= 8 / август) = @billdate 2018-09-10
, это платные пользователи:
Test2 Test3
Однако, когда я изменяю период выставления счета на 10 октября, это платные пользователи:
Тест Test2 Test3
@billdate
в своих образцах данных? - person Kahn Kah   schedule 07.09.2018