我有一个返回时隙的mysql查询。我有一个名为timeslots的表,其中包含starttimeb,endtimeb和employeeb。预订的Starttime和endtime字段来自另一个名为schedule的表。问题是我只能分配由时间表定义的约会。
例如我想要8:00到10:00,10:00到12:00,12:00到14:00,14:00到16:00和16:00到18:00不可用的插槽如果在计划表中有1个计划项目,其开始时间为08:00,结束时间为18:00。营业时间定义为8:00到18:00,因此在此期间只有两个小时的时间段可用,并且可以预订超过时隙表中提供的2小时时间段的预约,例如,已预订8:00至12:00我只想在12:00至14:00,14:00至16:00和16:00至18:00之间使用。或者,如果在12:00至14:00之间预订9:00至11:00,则可以在14:00至16:00和16:00至18:00之间预订。
mysql_query( "SELECT *
FROM timeslots
LEFT OUTER JOIN
(SELECT
starttime
, endtime
, custno
, id
FROM schedule
WHERE schedule.date = '2012-12-14'
) AS a
ON a.starttime >= timeslots.starttimeb
AND a.endtime <= timeslots.endtimeb
AND a.custno = timeslots.custnob" );
上面的查询返回类似这样的内容...在我的应用程序中设置如果starttime为null,则时隙可用。
starttimeb endtimeb custnob starttime endtime custno id 08:00:00 10:00:00 Michael W Sloan 08:00:00 10:00:00 Michael W Sloan 15670 10:00:00 12:00:00 Michael W Sloan NULL NULL NULL NULL 12:00:00 14:00:00 Michael W Sloan NULL NULL NULL NULL 14:00:00 16:00:00 Michael W Sloan 14:00:00 16:00:00 Michael W Sloan 15673 16:00:00 18:00:00 Michael W Sloan NULL NULL NULL NULL 08:00:00 10:00:00 James T Reesor 08:00:00 10:00:00 James T Reesor 15664 10:00:00 12:00:00 James T Reesor NULL NULL NULL NULL 12:00:00 14:00:00 James T Reesor NULL NULL NULL NULL 14:00:00 16:00:00 James T Reesor NULL NULL NULL NULL 16:00:00 18:00:00 James T Reesor 16:00:00 18:00:00 James T Reesor 15674 08:00:00 10:00:00 Carlton L. Pierce NULL NULL NULL NULL 10:00:00 12:00:00 Carlton L. Pierce NULL NULL NULL NULL 12:00:00 14:00:00 Carlton L. Pierce 12:00:00 14:00:00 Carlton L. Pierce 15671 14:00:00 16:00:00 Carlton L. Pierce NULL NULL NULL NULL 16:00:00 18:00:00 Carlton L. Pierce NULL NULL NULL NULL 08:00:00 10:00:00 Frankie D Aldridge NULL NULL NULL NULL 10:00:00 12:00:00 Frankie D Aldridge NULL NULL NULL NULL 12:00:00 14:00:00 Frankie D Aldridge NULL NULL NULL NULL 14:00:00 16:00:00 Frankie D Aldridge NULL NULL NULL NULL 16:00:00 18:00:00 Frankie D Aldridge NULL NULL NULL NULL 08:00:00 12:00:00 Michael W Sloan 08:00:00 10:00:00 Michael W Sloan 15670
答案 0 :(得分:1)
很难理解问题是什么,但如果问题是你想要查找时间表中的任何行是否与时间段表中的时间重叠,那么更改
ON a.starttime >= timeslots.starttimeb
AND a.endtime <= timeslots.endtimeb
只将在给定时间段内开始和结束的计划行匹配到
ON a.starttime < timeslots.endtimeb
AND a.endtime > timeslot.starttimeb
匹配在所讨论的时间段之前既不完全在之前也不完全的计划行可能有帮助。