>

활동 테이블 :

create table #activity(id int, begin_date datetime, end_date datetime)
insert into #activity values(1, '1/1/2017', '1/31/2017')
insert into #activity values(1, '9/1/2017', '9/15/2017')
insert into #activity values(1, '4/1/2017', '4/15/2017')
insert into #activity values(1, '2/5/2017', '2/15/2017')
insert into #activity values(1, '8/1/2017', '8/31/2017')
Insert into #activity values(2, '11/1/2016', '11/15/2016')

현재 입력 날짜는 2016 년 12 월 1 일이며 id는 2016 년 12 월 1 일 이후 50 일 이내에 모든 활동을 받고 싶습니다. 쿼리는 시작 날짜가 2017 년 1 월 1 일, 2017 년 2 월 5 일 (2017 년 1 월 31 일의 50 일 이내) 및 4/1/17 인 활동을 반환해야합니다.

2017 년 8 월 1 일 및 ID 1의 9/1/2017은 선택하지 않아야합니다. 8/1은 4/15의 50 일에 포함되어 있지 않으며 50 일주기가 중단되었습니다.

TIA


  • 답변 # 1

    OP의 말 :

    와이즈 비즈

    그 결과를 달성하기위한 하나의 가능한 쿼리는

    would like to get all activities within 50 days after 12/1/2016

    그러나 OP는 다음과 같이 말합니다.

    와이즈 비즈

    이는 순차적 활동 사이의 간격이 50 일 미만인 2016 년 1 월 1 일 이후에 시작하는 모든 순차적 활동을 찾으려는 것을 나타냅니다.

    이를위한 한 가지 가능한 접근 방법은 지연 기능을 사용하는 것입니다. 이 문제에서 지연 기능을 사용하는 방법의 예는 다음과 같습니다.

    -- get all activities with a begin_date within 50 days of input_date
    select *
    from #activity as a
    where @input_date <= a.begin_date and a.begin_date < dateadd(day, 50, @input_date)
    
    

    약간 이걸 만들어내는 단순화 :

    Query should return activities with begin dates 1/1/2017, 2/5/2017 (because this is within 50 days of 1/31/2017), and 4/1/17. 8/1/2017 and 9/1/2017 of id 1 shouldn't be selected 8/1 is not with in 50 days of 4/15 and 50 day cycle was broken.

    select a.* , lag(a.end_date, 1, @input_date) over (order by a.end_date) as previous_end , datediff(day, lag(a.end_date, 1, @input_date) over (order by a.end_date), a.begin_date) as previous_end_to_this_begin from #activity as a where @input_date <= a.begin_date order by a.begin_date

  • 이전 autohotkey - AHK에서 화면에 텍스트를 표시하는 방법
  • 다음 java - 형식화 된 문자열을 날짜로 변환