2012-12-25 2 views
1

약속을 설정할 수있는 iPhone 용 응용 프로그램을 만들려고합니다. 모든 것이 MySQL 데이터베이스에 저장되며 현재 JSON을 통해 내 응용 프로그램에 데이터를 가져옵니다. 이는 워크 플로입니다.iPhone의 일정 약속 충돌을 감지하는 SQL 문

  • User1은 작업 할 때를 정의합니다. 예 : 오전 8시 - 오후 4시.
  • User2는 user1과 약속을 잡길 원합니다 (예 : 오전 8시 ~ 9시.

스크립트는이 작업을 수행 할 수 있어야한다 :

  • 약속이 사용자의 작업 시간 내에;
  • 세 가지 가능한 방법으로 발생할 수있는 기존 약속과 충돌하지 않습니다.
    • 새 약속 중에 충돌 약속이 시작됩니다. 및/또는
    • 새 약속 중에 충돌 약속이 종료됩니다. 또는
    • 충돌 약속은 새 약속 시작 전과 종료 후입니다.

      // new row should be added here when the conditions above are met 
      create table ios_appointment (
          appointmentid int not null auto_increment, 
          start timestamp, 
          end timestamp, 
          user_id_fk int 
      ) 
      
      // a working hour has a n:1 relationshipt to ios_worker 
      create table ios_workinghours (
          workinghoursid int not null auto_increment, 
          start timestamp, 
          end timestamp, 
          worker_id_fk int 
      ) 
      
      // employee, has a 1:n relationship to ios_workinghours 
      create table ios_worker (
          workerid int not null auto_increment, 
          prename varchar(255), 
          lastname varchar(255), 
          ... 
      ) 
      

      select 절에 대한 입력이 타임 스탬프, startend 있습니다

이은 중요한 테이블 있습니다. 이들은 사용자에 의해 정의됩니다. 따라서 스크립트는 사용자 2가 특정 시간에 작업하고 있고 이미 약속이 있는지 확인해야합니다.

나는 현재이 같은 것을 가지고 있지만, 그것은 테이블을 연결하는 USER_ID를 사용

SELECT EXISTS (
    SELECT * 
    FROM ios_appointments a JOIN ios_workhours h USING (user_id) 
    WHERE user_id = 1 
    AND h.start <= '08:00:00' AND h.end >= '09:00:00' 
    AND (
       a.start BETWEEN '08:00:00' AND '09:00:00' 
      OR a.end BETWEEN '08:00:00' AND '09:00:00' 
      OR (a.start < '08:00:00' AND a.end > '09:00:00') 
     ) 
    LIMIT 1 
) 

모든 도움에 감사드립니다. 고마워.

+2

왜 SQL로 하시겠습니까? 당신은 단지 당신의 DB를 어떤 데이터 구조로 읽고 당신이 필요로 할 때 그것을 운영 할까? – Misha

답변

1

앱을 데이터로 읽은 다음 시간을 사용할 수 있는지 확인하거나 사용 가능한 '시간 슬롯'(예 : 30 분마다)이있는보기를 만들어야합니다. 여기

내가 그것을 할 것입니다 방법은 다음과 같습니다

CREATE TABLE #timeslot 
(
timeslot_id INT PRIMARY KEY IDENTITY(1,1), 
timeslot_time DATETIME NOT NULL 
) 

DECLARE @startime DATETIME, @endtime DATETIME 
SELECT @starttime = '12/25/2012 08:00:00.000', @endtime = '12/25/2012 15:00:00.000' 

WHILE @starttime < @endtime BEGIN 
    INSERT INTO #timeslot (timeslot_time) 
    VALUES (@starttime) 
    SET @starttime = DATEADD(mm,30,@starttime) 
END 

SELECT 
    w.workerid, 
    ts.timeslot_time 
INTO 
    ios_workertimeslot 
FROM 
    #timeslot ts 
FULL OUTER JOIN 
    ios_worker w 
    ON (1 = 1) 


SELECT 
    wts.workerid, 
    wts.timeslot_time, 
    ap.appointmentid, 
    CASE WHEN ap.appointmentid IS NOT NULL THEN 0 ELSE 1 END AS AvailableSlot 
FROM 
    ios_workertimeslot wts 
JOIN 
    ios_workinghours wh 
    ON (wts.workerid = wh.workerid) 
    AND (wts.timeslot_time >= wh.start) 
    AND (wts.timeslot_time < wh.end) 
LEFT JOIN 
    ios_appointment ap 
    ON (wts.workerid = ap.workerid) 
    AND (wts.timeslot_time >= ap.start) 
    AND (wts.timeslot_time < ap.end) 

이 가능한 비 사용 가능한 슬롯을 나타내는 데이터 세트와 함께 당신을 떠날 것입니다.

희망이 도움이됩니다.

관련 문제