2012-03-03 88 views
7

在PHP和MySQL中 - 如何确定商店是打开还是关闭(返回true或false)?确定商店是否开放?

如果商店关闭,如何获得下一个营业时间?

Opening_Hours表中的实施例:

+----+---------+----------+-----------+------------+---------+ 
| id | shop_id | week_day | open_hour | close_hour | enabled | 
+----+---------+----------+-----------+------------+---------+ 
| 1 |  1 |  1 | 16:30:00 | 23:30:00 |  1 | 
| 2 |  1 |  2 | 16:30:00 | 23:30:00 |  1 | 
| 3 |  1 |  3 | 16:30:00 | 23:30:00 |  0 | 
| 4 |  1 |  4 | 16:30:00 | 23:30:00 |  1 | 
| 5 |  1 |  5 | 10:00:00 | 13:00:00 |  1 | 
| 6 |  1 |  5 | 17:15:00 | 00:30:00 |  1 | 
| 7 |  1 |  6 | 17:15:00 | 01:30:00 |  1 | 
| 8 |  1 |  7 | 16:30:00 | 23:30:00 |  0 | 
+----+---------+----------+-----------+------------+---------+ 

open_hourclose_hour是TIME类型字段。表设计好吗?

当前倍的实施例:

  • 当前时间:星期二23:00, - 输出:打开, '打开在星期二16:30 - 23:30'

  • 当前时间:周二23:40, - 输出:关闭, '打开在周四16:30 - 23:30'

公开赛周四因为Opening_Hours.week_day = 3被禁用


现在如何处理午夜时间?这变得更加复杂。

正如你所看到的,上周六(Opening_Hours.week_day = 5),它是开放的,从17:15到下午01:30(闭第二天星期日)

如果当前时间为周日上午1点15分,那么商店仍将基于Opening_Hours.week_day = 5开放。

输出:打开“在打开周六17:15 - 01:30”

+0

请不要在一次发布多个问题。将问题制动成更小的部分并提出具体问题。此外,这看起来像是作业,这是不欢迎在这里... – 2012-03-03 12:54:56

+5

@JanHančič这不是一次多个问题。我的问题是如何找出商店是打开还是关闭。其次,这不是功课。 – user1246800 2012-03-03 13:04:19

+0

它看起来像我的功课,但如果你说它不是那么我相信你:) – 2012-03-03 14:11:00

回答

3

在过去,我已经使用时间戳没有日期(秒从午夜开始)来处理这一点。因此,对于周六,开盘价为62100,收盘价为91800

我的想法是,这样可以在接近午夜时删除一些所需的逻辑,因为您只需比较从日期开始到时间范围的秒数。

而且很容易检查它是否仍然从'昨天'打开 - 只需将86400添加到当前'时间'(自一天开始以来的秒数),并检查前一天。

可能是所有的单个SQL语句。

1

您可以使用PHP date()函数并将其与开放时间进行比较。

你可以做这样的事情递归函数(不工作的PHP代码,但PHP与伪代码组合):

/* $current_time should be in the format of date("His") */ 
function check_hours($current_day, $current_time) 
{ 
    Get the MySQL row for today here 

    if (Opening_Hours.enabled == 1 WHERE Opening_Hours.week_day == $current_day) 
    { 
     if ((date("His") >= Opening_Hours.open_hour) and ($current_time <= Opening_Hours.close_hour)) 
     { 
      // convert_numeric_day_to_full_representation isn't a real function! make one 
      return 'Open: ' . convert_numeric_day_to_full_representation($current_day) . ' ' . Opening_Hours.open_hour . ' – ' . Opening_Hours.close_hour; 
     } 
     elseif (date("His") < Opening_Hours.open_hour) 
     { 
      return 'Closed: Next opening hours: ' . convert_numeric_day_to_full_representation($current_day) . ' ' . Opening_Hours.open_hour . ' – ' . Opening_Hours.close_hour; 
     } 
     else 
     { 
      return check_hours($tomorrow, '000000'); 
     } 
    } 
    else 
    { 
     return check_hours($tomorrow, '000000'); 
    } 
}