1

予定を立てられるiPhone用のアプリを作ってみました。すべてがMySQLデータベースに保存され、現在、JSONを介してデータをアプリに取得しています。これはワークフローです:

  • User1は、いつ作業するかを定義します。例:午前8時から午後4時。
  • User2は、user1との約束を持ちたいと考えています(例:午前8時から午前9時)。

スクリプトはこれを実行できる必要があります。

  • 予定はユーザーの勤務時間内です。と
  • 既存の予定と衝突することはありません。これは、次の3つの方法で発生する可能性があります。
    • 衝突する予定は、新しい予定の間に始まります。および/または
    • 衝突する予定は、新しい予定の間に終了します。また
    • 衝突する予定は、新しい予定の前に開始し、後に終了します。

これらは重要なテーブルです:

// 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句の入力は、2つのタイムスタンプ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
)

すべての助けに感謝します。どうも。

4

1 に答える 1

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)

これにより、使用可能なタイムスロットと使用できないタイムスロットを示すデータセットが残ります。

お役に立てれば!

于 2012-12-25T17:51:46.347 に答える