我想将有限时间插入数据库。 例如:Peter 13:00 - 19:00
彼得告诉我们他不能在18:00到22:00之间工作。 (这位于数据库中)。所以13:00-19:00的时间不能插入到数据库中,因为结束时间(19:00)在18:00到22:00的时间范围内。
如何检查?
我尝试过几件事,但我不知道该怎么做。
立即了解
$van_besch = '18:00';
$tot_besch = '22:00';
$van = '13:00';
$tot = '19:00';
if (($van_besch >= $van) && ($tot_besch <= $tot)) {
$error ='<font color="red">Time '.$van_besch.' - '.$tot_besch.' Not available</font>';
}
这不会奏效。
感谢阅读!
答案 0 :(得分:2)
实际上有两种情况需要检查:
$van
相等或介于$van_besch
和$tot_besch
之间
$tot
相等或介于$van_besch
和$tot_besch
之间
如果$van
和$tot
都在$van_besch
和$tot_besch
之间,则两种情况都属实。
您还需要处理跨越休息时间的轮班,例如: 17:00 - 02:00另一个问题是您需要处理的是20:00 - 0:00,因为0:00小于20:00。
因此,我们将实时投影到我们自己的时间格式。
这意味着17:00 - 02:00将成为17:00 - 26:00。请注意,我们需要为$van_besch
- $tot_besch
和$van
- $tot$
执行此操作。
在代码中看起来像:
if ($tot < $van){
$tot = 24:00 - $van + $tot;
}
if ($tot_besch < $van_besch){
$tot = 24:00 - $van + $tot;
}
if (($van >= $van_besch) && ($van <= $tot_besch) ) || (($tot >= $tot_besch) && ($tot <= $tot_besch)){
... Peter is not available ...
}
答案 1 :(得分:0)
最好转换它们并使用strtotime
进行比较。这样的事情对你有用:
$van_besch = '18:00';
$tot_besch = '22:00';
$van = '13:00';
$tot = '19:00';
if (strtotime($van) < strtotime($van_besch) || strtotime($tot ) > strtotime($tot_besch)) {
//code goes here
}
答案 2 :(得分:-1)
您可以在SQL查询中确定这一点。如果您只是存储时间,最好将其作为int 0000 - 2359
。
所以我们的表看起来像这样。
CREATE TABLE off_time (
id int(12) AUTO_INCREMENT,
employee int(12) NOT NULL,
start_time smallInt(4) unsigned NOT NULL,
end_time smallInt(4) unsigned NOT NULL,
PRIMARY KEY (id)
);
我们正在存储一个开始和结束时间,以创建一个他们无法工作的时间块。显然,在您的代码中,确保这些块有意义并且start_time&lt; = end_time。
非常重要。现在我们可以查询。
// Here we use just < and > but you can make them <= and >= if you don't want time slots to possibly overlap start/end times.
SELECT ot.id, IF( 1300 < ot.end_time AND 1900 > ot.start_time, 1, 0) AS blocked
FROM off_time as ot
WHERE ot.employee = 1;
您将获得一个表格,其中每一行将包含被阻止的时段的id
,而blocked
列为1表示已被阻止,0表示不是。因此,如果任何条目为1,那么您就知道您的时间被阻止了。这样做也很方便,因为您还可以关联原因表,并能够回答原因。 LEFT JOIN time_off_reasons as r on r.id = ot.id
如果您想特定日期。只需存储timestamp
开始和结束时间。比较将是相同的,只是改为时间戳。
修改强> Marc B.在关于时间块的评论中提出了一个很好的观点,这些时间块延伸到午夜标记,即2200 - 0200.使用我的方法,你可以确保将它们分开作为单独的条目。
所以INSERT INTO off_time (start_time, end_time) VALUES(2200, 2400)(0000,0200)
这仍然可以按预期工作。但是你只需要两个条目一次性关闭块,这可能很烦人,但仍然比编写额外的代码来补偿逻辑更容易。