2016-06-22 4 views
0

Мне нужно найти членство между двумя датами (7-01-14 и 6-30-15), которые были членами не менее 4 месяцев или более в течение этого периода времени. Существует START_DATE и столбец END_DATE. Любой совет будет принят во внимание. Спасибо.Поиск членов между диапазоном дат

+1

Вы можете показать нам все свои столбцы? –

+0

Пожалуйста, покажите, что вы пробовали, и некоторые образцы данных и результатов будут очень полезны! – gofr1

+1

Вот совет - прочитайте [ask]. Измените свой вопрос, чтобы включить соответствующие таблицы ddl и некоторые примеры данных в формате ddl. Также укажите желаемые результаты. –

ответ

0

Вы можете использовать этот код:

select * 
from YourTable 
where DateColumn between '2014/01/7' and '2006/05/30' and 
    start_date >= Dateadd(Month, Datediff(Month, 0, DATEADD(m, -4, current_timestamp)), 0) 
0

Назовём вашу таблицу регистрации.

Во-первых .. мы хотим, чтобы все люди, которые были зачислены между 7-01-14 и 6-30-15

Select * 
From Enrollment 
Where Start_Date Between '7-01-14' and '6-30-15' 
And End_Date Between '7-01-14' and '6-30-15' 

Кроме того, членство должно быть, по крайней мере найдено месяцев долго в этом отрезок времени.

Select * 
From Enrollment 
Where Start_Date Between '7-01-14' and '6-30-15' 
And End_Date Between '7-01-14' and '6-30-15' 
And DateDiff (month, Start_Date, End_Date) > 4 

Но рассмотреть эти сценарии:

  • Что произойдет, если кто-то подпишется на «6-25-15» (за 5 дней до конца отсечки) и действует в течение 4-х месяцев?
  • Что произойдет, если кто-то зарегистрируется на «4-01-14» (за 3 месяца до начала отсечки) и активен в течение 4 месяцев?

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

Например, если Дата_начал ИЛИ датой_окончание может быть между датами отрезной указан, но членство еще должно быть 4 месяца длиной

Select * 
From Enrollment 
Where 
(
    Start_Date Between '7-01-14' and '6-30-15' 
    OR End_Date Between '7-01-14' and '6-30-15' 
) 
And DateDiff (month, Start_Date, End_Date) >= 4 

Но что, если Дата_начали меньше, чем начало cutff, и датой_окончание больше, чем в конце отсечки, а членство еще должно быть 4 месяца длиной

Select * 
From Enrollment 
Where 
(
    (Start_Date Between '7-01-14' and '6-30-15' OR End_Date Between '7-01-14' and '6-30-15') 
    OR 
    (Start_Date < '7-01-14' and End_Date > '6-30-15') 
) 
And DateDiff (month, Start_Date, End_Date) >= 4 
+0

К сожалению, это не сработает по двум причинам, датированный в течение месяца может составлять 3 месяца и 1 день и по-прежнему будет включен. Другая причина заключается в том, что у вас пропали люди с start_date и end_date за пределами интервала –

+0

Это действительно работает в обоих случаях .. проверить последний запрос –

+0

да, они оба дают неверный результат –

1

Это будет работать для SQLServer 2012. Если вы используете более раннюю версию, вы можете заменить где пункт:

DECLARE @t table(START_DATE date, END_DATE date) 
INSERT @t values 
('2015-01-01','2015-08-30'),('2015-01-01','2015-12-30'), 
('2015-08-01','2015-12-30'),('2015-11-01','2017-12-30'), 
('2016-01-01','2017-12-30'),('2017-01-01','2017-12-30') 

DECLARE @from date='2015-7-01' 
DECLARE @to date='2016-03-01' 

SELECT * 
FROM @t 
WHERE 
    DATEADD(month,4, IIF(@from<START_DATE, START_DATE, @FROM)) <= 
    IIF(@to>END_DATE, END_DATE, @to) 

/* 
    --this is for sqlserver 2008 
    DATEADD(month,4, CASE WHEN @from<START_DATE THEN START_DATE ELSE @FROM END) <= 
    CASE WHEN @to>END_DATE THEN END_DATE ELSE @to END 
*/ 
+1

Спасибо за подсказки! – gofr1

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