在我的系统中,我有两张桌子。一个用于staff
,另一个用于jobs
。
Jobs表包含以下数据: job_id(int) staff_id(int) starttime(datetime) 结束时间(日期时间)
员工很简单: staff_id(id) name(varchar)
但是,我需要想出办法来确定工作人员是否可用。意思是他们已经安排好了。例如,staff_id
保存了以下数据:
starttime:2016-01-11 12:00
enddtime:2016-01-11 17:00
2016-01-11 16:00开始不能上新工作。此外,他们不应该在2016-01-11 13:00结束工作。
我试图搜索一些PHP日历逻辑但到目前为止还没有找到任何好处。
EDIT
我所做的是使用以下代码检查某个块内的日期。但是,如果userstart
和userend
都在日期范围startdate
和enddate
之外,则此剂量无效。
$starttime = "2016-01-11 20:00";
$endtime = "2016-01-11 22:00";
$userstart = '2016-01-11 20:10';
$userend = '2016-01-12 01:10';
function check_time($starttime, $endtime, $userstart, $userend){
$start_ts = strtotime($starttime);
$end_ts = strtotime($endtime);
$userstart_ts = strtotime($userstart);
$userend_ts = strtotime($userend);
if(($userstart_ts >= $start_ts) && ($userstart_ts <= $end_ts) OR ($userend_ts >= $start_ts) && ($userend_ts <= $end_ts)){
return true;
}else{
return false;
}
}
if(check_time($starttime, $endtime, $userstart, $userend)){
echo 'Staff work';
}else {
echo 'Staff free';
}
以上将输出&#34;员工的工作&#34;。但是,如果我更改为以下内容,则会打印出Staff free
$userstart = '2016-01-11 19:10';
$userend = '2016-01-12 01:10'
答案 0 :(得分:0)
最后我最终得到了这段代码。最后一个问题是处理重叠的事件。
$starttime = "2016-01-11 20:00";
$endtime = "2016-01-11 22:00";
$userstart = '2016-01-11 19:10';
$userend = '2016-01-11 21:10';
function check_time($starttime, $endtime, $userstart, $userend){
$start_ts = strtotime($starttime);
$end_ts = strtotime($endtime);
$userstart_ts = strtotime($userstart);
$userend_ts = strtotime($userend);
if(($userstart_ts >= $start_ts) && ($userstart_ts <= $end_ts) OR ($userend_ts >= $start_ts) && ($userend_ts <= $end_ts)){
return true;
}else{
if(($userstart_ts <= $start_ts) && ($userend_ts >= $end_ts)){
return true;
}else{
return false;
}
}
}
if(check_time($starttime, $endtime, $userstart, $userend)){
echo 'Staff work';
}else {
echo 'Staff free';
}
但是,为了使用此function
,我将被迫遍历数据库中的所有entries
。我认为这不会有效率
修改强>
下面是我提出的最终SQL查询。它会显示当前正在userstart
和userend
工作的员工,以防有人寻找类似的东西。
SELECT staff FROM staff WHERE (startdate BETWEEN '2016-01-11 22:00' AND '2016-01-11 23:00') OR (enddate BETWEEN '2016-01-11 22:00' AND '2016-01-11 23:00') OR (startdate < '2016-01-11 22:00' AND enddate > '2016-01-11 23:00');