Php 基于数据库中的时间记录的打开/关闭状态
我有一个mySQL表,根据时间框架指示商店是开门还是关门:Php 基于数据库中的时间记录的打开/关闭状态,php,mysql,codeigniter,Php,Mysql,Codeigniter,我有一个mySQL表,根据时间框架指示商店是开门还是关门: shift table -------------- shift_id day_of_week (1-7 : Monday-Sunday) open_time (time, default NULL) close_time (time, default NULL) type (1 || 2) 字段类型说明: 1表示当天的第一个时间段,2表示当天的第二个时间段。 例如,商店在13:
shift table
--------------
shift_id
day_of_week (1-7 : Monday-Sunday)
open_time (time, default NULL)
close_time (time, default NULL)
type (1 || 2)
字段类型说明:
1表示当天的第一个时间段,2表示当天的第二个时间段。
例如,商店在13:00-15:00和18:00-01:00营业
我使用以下方法获取当前日期:
$jd = cal_to_jd(CAL_GREGORIAN,date("m"),date("d"),date("Y"));
$day = jddayofweek($jd, 0);
switch($day){
case 0:
$curDay = 7;
break;
default:
$curDay = $day;
break;
}
return $curDay;
$timeString = "%H:%i:%s";
$curTime = mdate($timeString, time());
我使用以下方法获取当前时间:
$jd = cal_to_jd(CAL_GREGORIAN,date("m"),date("d"),date("Y"));
$day = jddayofweek($jd, 0);
switch($day){
case 0:
$curDay = 7;
break;
default:
$curDay = $day;
break;
}
return $curDay;
$timeString = "%H:%i:%s";
$curTime = mdate($timeString, time());
下面是一个复杂的例子:当日:周一
当前时间:02:00。
周日时间范围:15:00-18:00和21:00-02:30。
周一时间范围:08:30-15:30 显然,这一转变是开放的,但基于周日的时间框架,而不是当前的周一 查询我的表(或根据需要更改我的表)的最佳方法是什么?或者,在给定日期的给定时间内,以100%准确的方法定义每次轮班是打开还是关闭?
函数车间_open(){
function shop_open(){
//Get current day
$day = $this->_get_current_day();
//Get current time
$timeString = "%H:%i:%s";
$ordertime = mdate($timeString, time());
//Predefine ability to order to false
$canOrder = false;
$getShift = $this->db->query("select * from `shop_hours` where `day_of_week` = $day AND !ISNULL(`open_time`) ORDER BY `type`");
$day_num_rows = $getShift->num_rows();
switch($day_num_rows){
case 0: //No records
$canOrder = false;
break;
case 1: //Only 1 timeframe
foreach($getShift->result() as $row){
$open_time = $row->open_time;
$close_time = $row->close_time;
}
if($open_time <= $close_time){//Timeframe is within the same day [no overlap]
if($open_time < $ordertime && $close_time > $ordertime){//Current time is within timeframe
$canOrder = true;
}else{
$canOrder = false;
}
}else if($open_time > $close_time){//There s your overlap [timframe "catches" the next day]
if($open_time < $ordertime && '23:59' >= $ordertime){//Check till midnight first
$canOrder = true;
}else{//Check in the previous day
if($day == 1){ $previousDay = 7; }else{ $previousDay = $day-1; }
$getPrvDayShift = $this->db->query("select * from `shop_hours` where `day_of_week` = $previousDay ORDER BY `type`");
$prv_day_num_rows = $getPrvDayShift->num_rows();
switch($prv_day_num_rows){
case 0://No records
$canOrder = false;
break;
case 1://One record found
foreach($getPrvDayShift->result() as $row2){
$prv_close_time = $row2->close_time;
}
if($prv_close_time > $ordertime){ //So if the previous day close time is greater than current, we are good to go
$canOrder = true;
}else{
$canOrder = false;
}
break;
case 2: //2nd record found
foreach($getPrvDayShift->result() as $row2){
if($row2->type == 2){
$prv_close_time = $row2->close_time;
}
}
if($prv_close_time > $ordertime){ //Same shit, different timeframe within the same day
$canOrder = true;
}else{
$canOrder = false;
}
break;
}
}
}
break;
case 2: //Ok now we have to check the case of 2 timeframes together
for($i=1; $i<3; $i++){
foreach($getShift->result() as $row){
if($row->type == $i){
$open_time = $row->open_time;
$close_time = $row->close_time;
}
}
if($open_time <= $close_time){//Again, same day [no overlap]
if($open_time < $ordertime && $close_time > $ordertime){//Good to go we are within timeframe
$canOrder = true;
}else{
$canOrder = false;
}
}else if($open_time > $close_time){//There s your overlap
//Check till midnight
if($open_time < $ordertime && '23:59' >= $ordertime){ $canOrder = true; }
}
}
if(!$canOrder){
//Now we should check the previous day also if $canOrder is still negative
if($day == 1){ $previousDay = 7; }else{ $previousDay = $day-1; }
$getPrvDayShift = $this->db->query("select * from `shop_hours` where `day_of_week` = $previousDay ORDER BY `type`");
$prv_day_num_rows = $getPrvDayShift->num_rows();
switch($prv_day_num_rows){
case 0:
$canOrder = false;
break;
case 1:
foreach($getPrvDayShift->result() as $row2){
$prv_close_time = $row2->close_time;
}
if($prv_close_time > $ordertime){ $canOrder = true; }else{ $canOrder = false; }
break;
case 2:
foreach($getPrvDayShift->result() as $row2){
if($row2->type == 2){
$prv_close_time = $row2->close_time;
}
}
if($prv_close_time > $ordertime){ $canOrder = true; }else{ $canOrder = false; }
break;
}
}
break;
}
return $canOrder;
}
//获取当前日期
$day=$this->_get_current_day();
//获取当前时间
$timeString=“%H:%i:%s”;
$ordertime=mdate($timeString,time());
//预先定义订单到错误的能力
$canOrder=错误;
$getShift=$this->db->query(“从'shop\u hours'中选择*,其中'day\u of\u week`=$day!且!为空('open\u time`)按'type`排序的订单”);
$day_num_rows=$getShift->num_rows();
开关($day\u num\u行){
案例0://无记录
$canOrder=错误;
打破
案例1://仅1个时间范围
foreach($getShift->result()作为$row){
$open\u time=$row->open\u time;
$close\u time=$row->close\u time;
}
如果($open\u time$ordertime){//当前时间在时间范围内
$canOrder=true;
}否则{
$canOrder=错误;
}
}否则如果($open\u time>$close\u time){//第二天有重叠[timframe“捕获”]
如果($open_time<$ordertime&&'23:59'>=$ordertime){//先检查到午夜
$canOrder=true;
}否则{//在前一天登记
如果($day==1){$previousDay=7;}否则{$previousDay=$day-1;}
$getPrvDayShift=$this->db->query(“从'shop\u hours'中选择*其中'day\u of u week`=$previousDay ORDER BY`type`”);
$prv_day_num_rows=$getPrvDayShift->num_rows();
开关($prv\u day\u num\u行){
案例0://无记录
$canOrder=错误;
打破
案例1://找到一条记录
foreach($getPrvDayShift->result()作为$row2){
$prv_close_time=$row2->close_time;
}
如果($prv_close_time>$ordertime){//那么如果前一天的关闭时间大于当前时间,我们就可以开始了
$canOrder=true;
}否则{
$canOrder=错误;
}
打破
案例2://发现第二条记录
foreach($getPrvDayShift->result()作为$row2){
如果($row2->type==2){
$prv_close_time=$row2->close_time;
}
}
如果($prv\U close\U time>$ordertime){//同一天内相同的狗屎,不同的时间段
$canOrder=true;
}否则{
$canOrder=错误;
}
打破
}
}
}
打破
案例2://好的,现在我们必须一起检查两个时间段的案例
对于($i=1;$iresult()作为$row){
如果($row->type==$i){
$open\u time=$row->open\u time;
$close\u time=$row->close\u time;
}
}
如果($open\u time$ordertime){//很好,我们在时间范围内
$canOrder=true;
}否则{
$canOrder=错误;
}
}否则,如果($open\u time>$close\u time){//有重叠
//检查到午夜
如果($open_time<$ordertime&&'23:59'>=$ordertime){$canOrder=true;}
}
}
如果(!$canOrder){
//现在我们还应该检查前一天$canOrder是否仍然为负数
如果($day==1){$previousDay=7;}否则{$previousDay=$day-1;}
$getPrvDayShift=$this->db->query(“从'shop\u hours'中选择*其中'day\u of u week`=$previousDay ORDER BY`type`”);
$prv_day_num_rows=$getPrvDayShift->num_rows();
开关($prv\u day\u num\u行){
案例0:
$canOrder=错误;
打破
案例1:
foreach($getPrvDayShift->result()作为$row2){
$prv_close_time=$row2->close_time;
}
如果($prv\U close\U time>$ordertime){$canOrder=true;}否则{$canOrder=false;}
打破
案例2:
foreach($getPrvDayShift->result()作为$row2){
如果($row2->type==2){
$prv_close_time=$row2->close_time;
}
}
如果($prv\U关闭\U时间>
INSERT INTO Shifts (
start_day,
start_time,
end_day,
end_time
) VALUES
( LOWER('Sunday'), '15:00:00', LOWER('Sunday'), '18:30:00' ),
( LOWER('Sunday'), '21:00:00', LOWER('Monday'), '26:30:00' ),
( LOWER('Monday'), '12:00:00', LOWER('Monday'), '18:00:00' ),
( LOWER('Tuesday'), '10:00:00', LOWER('Tuesday'), '20:45:00' ),
( LOWER('Wednesday'), '16:00:00', LOWER('Wednesday'), '19:30:00' ),
( LOWER('Thursday'), '10:00:00', LOWER('Thursday'), '17:00:00' ),
( LOWER('Thursday'), '19:00:00', LOWER('Friday'), '25:30:00' ),
( LOWER('Friday'), '16:00:00', LOWER('Saturday'), '24:30:00' ),
( LOWER('Saturday'), '15:00:00', LOWER('Saturday'), '20:00:00' ),
( LOWER('Saturday'), '18:30:00', LOWER('Sunday'), '27:00:00' )
SELECT DAYNAME(NOW()), start_day
FROM Shifts
WHERE (start_day = LOWER(DAYNAME(NOW()))
AND start_time < CURTIME()
AND end_time > CURTIME())
OR (start_day = LOWER(DAYNAME(DATE_SUB(NOW(), INTERVAL 1 DAY)))
AND start_time < ADDTIME('24:00:00', CURTIME())
AND end_time > ADDTIME('24:00:00', CURTIME()))
SELECT DAYNAME(NOW()), start_day
FROM Shifts
WHERE (start_day = LOWER('Friday')
AND start_time < '01:12:35'
AND end_time > '01:12:35')
OR (start_day = LOWER('Thursday')
AND start_time < ADDTIME('24:00:00', '01:12:35')
AND end_time > ADDTIME('24:00:00', '01:12:35'))