2016-09-28 2 views
0

다음 열이있는 약속 표가있는 경우 특정 날짜 또는 두 날짜 사이에 발생하는 약속을 철회하기 위해 rrule을 어떻게 쿼리합니까? 그래서 예를 들어데이터베이스 테이블에 iCal RRULE로 저장된 반복 약속을 쿼리하는 방법은 무엇입니까?

Appointments 
------ 
id 
name 
dt_start 
dt_end 
rrule 

내가 2016년 9월 28일에 시작 2017년 4월 28일에 종료 약속이 말할 수 있으며 4 월 28 일 2017 까지 월요일, 금요일에 2 주마다 발생 RRULE 될 것이다 다음은 어떻게 할 지금

2016-09-30 FRI 
2016-10-10 MO 
2016-10-14 FRI 
2016-10-24 MO 

: 그래서 위의 예제를 사용하여

RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=20170428T230000Z;BYDAY=MO,FR EXDATE:20170414T023000Z 

, 위의 약속에 발생할 수있는 날짜의 일부는 다음을 포함 할 것 SQL 또는 다른 방법을 사용하여이 테이블을 쿼리하여 2016-10-10에 발생하는 모든 약속을 제거합니다.

레코드의 경우 C# asp.net 및 SQL 서버에서이 작업이 수행됩니다. rrule을 구문 분석하고 쿼리하는 데 사용할 수있는 C# 또는 SQL Server 라이브러리가 있습니까?

나는 ICAL.net을 살펴 봤지만 거기에 많은 문서가 없거나 위에 설명 된 용도로 사용하는 방법이없는 것 같습니다.

누구나 ICAL.net에 대한 경험이 있습니까?

+0

문자열을 분리하고 다른 부분을 추출해야하는 경우 시작과 끝 (반복적 인 cte) 또는 날짜 차원 사이에 날짜 테이블을 작성하면 날짜가 좋을 것입니다. 그런 다음 날짜, 인터페이스, 요일, 월말, 매월 1 일 목요일 등의 모든 조합을 식별하기 위해 일련의 사례 문장을 사용하십시오.이 작업은 가볍지 만 수행 가능합니다. – Matt

답변

0

반복되는 이벤트가 많으면 데이터베이스 및 응용 프로그램에 많은 작업이 필요합니다. 필자가 작성한 캘린더 응용 프로그램에서 이벤트를 만들 때 규칙을 확장하고 각 반복 이벤트를 별도의 행에 포함 시켰습니다. 필요한 경우 반복되는 이벤트를 함께 그룹화 할 수 있도록 고유 ID 필드 (ID 필드와 별도로 icalendar 사양의 UID)를 추가했습니다. 반복되는 시리즈의 각 이벤트는 동일한 고유 ID를가집니다. 표준 쿼리를 사용하여 날짜를 검색하는 것은 쉬운 일입니다. 또한 예외가 규칙에 포함되어 있으면 데이터베이스에 행이없는 예외를 포함하는 것을 피하는 것이 더 쉽습니다.

+0

데이터베이스 스키마의 예를 제공 할 수 있습니까? 반복되는 각 이벤트가 데이터베이스를 부 풀리지 않을까요? 종료일이없는 이벤트가 있지만 무한 반복됩니다. 이렇게하면 모든 데이터베이스 저장 공간이 빠르게 소모됩니다. 다음 문서를 참조하십시오. https://github.com/bmoeskau/Extensible/blob/master/recurrence-overview.md – adam78

+0

이벤트를 만들 때 반복되는 날짜를 일정 시간으로 제한하는 기간을 사용합니다. 1 년 전 ~ 3 년 후처럼 시간이지나면서 반복되는 날짜를 확장/제거하는 기능이 있습니다. 최고는 아니지만 쿼리가 빠릅니다. 테이블 스키마를 표시 할 공간이 충분하지 않지만이 기능이있는 Zap Calendar Lite의 무료 버전을 다운로드 할 수 있습니다 (Joomla가 필요함). http://zcontent.net/products/zap-calendar-lite – zcontent

0

누구나 ICAL.net에 대한 경험이 있습니까?

아니요,하지만 저는 php-rrule의 작성자입니다. 제 대답도 귀하의 상황에 적용될 것이라고 생각합니다.

아주 제한된 규칙 집합이없고 예를 들어 어떤 이벤트도 무한히 반복되거나 X 번 이상 반복되지 않는 경우를 제외하고는 저장 규칙이 확장되기 전에 규칙을 확장한다고 가정 해 보겠습니다. 일하게.

내가 아는 한, 당신은 SQL에서만 그것을 할 수 없다. 당신은 두 단계로 그것을해야한다. dt_start이거나 2016년 10월 10일 및 dt_end이거나 2016년 10월 10일 후 전에이다

  1. 쿼리 모든 이벤트.
  2. 규칙 (예 : BYDAY)으로 인해 2016-10-10에 발생하지 않을 모든 이벤트를 삭제합니다. 이를 위해서는 rrule 필드에서 빠르게 발생을 계산할 수있는 라이브러리 (예 : ICAL.net과 같은)가 필요합니다.

이 작업이 완료되면 결과를 캐시하는 것이 좋으므로 이후 쿼리의 경우 계산을 다시 수행하는 대신 2016-10-10에 대한 캐시를 읽을 수 있습니다. dt_startdt_end 사이의 2016-10-10을 포함하는 이벤트가 추가, 업데이트 또는 삭제 될 때마다 캐시를 ​​무효화해야합니다.

관련 문제