mysql时隙查询,包含开始时间和结束时间以及运行时间

时间:2013-01-11 19:33:33

标签: php mysql sql

我有一个返回时隙的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

1 个答案:

答案 0 :(得分:1)

很难理解问题是什么,但如果问题是你想要查找时间表中的任何行是否与时间段表中的时间重叠,那么更改

ON a.starttime >= timeslots.starttimeb
AND a.endtime <= timeslots.endtimeb

只将在给定时间段内开始和结束的计划行匹配到

ON a.starttime < timeslots.endtimeb
AND a.endtime > timeslot.starttimeb

匹配在所讨论的时间段之前既不完全在之前也不完全的计划行可能有帮助。