1

我尝试为 iPhone 创建一个应用程序,您可以在其中设置约会。一切都保存到 MySQL 数据库中,我目前通过 JSON 将数据获取到我的应用程序中。这是一个工作流程:

  • User1 定义他工作的时间。例如上午 8 点至下午 4 点。
  • 用户 2 想与用户 1 约会,例如上午 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
)

感谢您的每一次帮助。谢谢。

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 回答