【问题标题】:Find is a business is open: MySQL hours calculationFind is a business is open: MySQL 小时数计算
【发布时间】:2011-04-15 20:32:58
【问题描述】:

我有一个存储在locations 表中的企业列表,并且存储在该表中的是企业开放和关闭的时间:

location
`mon_1_open`
`mon_1_closed`
`tue_1_open`
`tue_1_closed`
`wed_1_open`
`wed_1_closed`

等等……

我以完整的小时和分钟存储时间,因此假设商家在周一上午 9:00 到下午 5:30 营业。mon_1_open = '900' AND mon_1_closed = '1730'。

我似乎无法找到一种方法来查找星期几和输出,如果业务是根据一天中的时间打开还是关闭。

有什么建议吗?

【问题讨论】:

    标签: php mysql select


    【解决方案1】:
    $dayOfWeek = strtolower(date('D'));
    
    $query = '
        SELECT
            location,
            '.$dayOfWeek.'_1_open <= '.date('Gi').' AND
            '.$dayOfWeek.'_1_closed >= '.date('Gi').' as is_open';
    

    应该可以的。

    但是,您确实应该为打开/关闭列使用适当的时间数据类型。

    【讨论】:

      【解决方案2】:

      这不一定能回答你的问题,但从长远来看可能会。

      您的数据库方案似乎有缺陷。它肯定没有标准化。我会在它成为一个大问题之前解决这个问题,因为您已经注意到它很难找到某些营业时间。这是一个可能更适合的方案草案。

      TABLE: locations
          id INT AUTO_INCREMENT PRIMARY KEY
          name VARCHAR(50) 
      
      TABLE: location_hours
          id INT AUTO_INCREMENT PRIMARY KEY
          location_id INT  -  Foreign Key references locations table
          day CHAR(3) - (examples: mon, tue, wed, thu, fri, sat, sun)
          hours VARCHAR(4) - (could also be int)
      

      然后要获取今天的日期,这可以在 MySQL 中使用 DATE_FORMAT %a 完成,示例查询:

      SELECT locations.name, location_hours.hours 
      FROM locations 
          JOIN location_hours ON locations.id = location_hours.location_id 
      WHERE location_hours.day = DATE_FORMAT(NOW(), '%a') 
          AND location.name = 'Someway Business'
      ORDER BY location_hours.hour
      

      应该不需要打开/关闭,因为ORDER BY 知道0900 &lt; 1430 因为它是VARCHAR(尽管INT 也应该知道如何对其进行排序),但您的代码在添加业务时需要更新此记录,或者您需要另一个字段 active 来表示是否应在查询中使用该行。请记住使用 24 小时制。这又是一个模型,我只是在现场创建了它,所以它可能需要一些改进,但这会比像你现在的代码那样做一个 hack 更好。

      更新

      解决有关查找是否打开或关闭的评论:

      只需使用PHP的date函数并调用date('Hi')这将得出24小时制的当前时间,然后你只需做一个简单的if语句看看它是否在它之间,如果是,它被打开。

      IE:

      $sql = "SELECT locations.name, location_hours.hours 
      FROM locations 
          JOIN location_hours ON locations.id = location_hours.location_id 
      WHERE location_hours.day = DATE_FORMAT(NOW(), '%a') 
          AND location.name = 'Someway Business'
      ORDER BY location_hours.hour";
      
      $result = mysql_query($sql) or trigger_error("SQL Failed with Error: " . mysql_error());
      
      $times = array();
      while ($row = mysql_fetch_assoc($result)) {
          if (empty($times['open'])) {
              $times['open'] = $row['hours'];
          }else {
              $times['closed'] = $row['hours'];
          }
      }
      
      $currentTime = date('Hi');
      
      if ($times['open'] <= $currentTime 
              && $times['closed'] > $currentTime) {
          echo "Open";
      }else {
          echo "Closed";
      }
      

      鉴于我的逻辑是正确的。同样,这只是伪代码的使用示例。鉴于我只是当场写的。以上假设您一次只查询一项业务。

      【讨论】:

      • 我喜欢你的概念,并希望使用它。但我根本没有输出。也许它在 date_format 上?我不明白它是如何工作的。
      • 如果你可以访问 MySQL 控制台,运行SELECT DATE_FORMAT('%a', NOW()); 它将以缩写形式输出今天的日期,所有这些在手册中都有解释。
      • 我想我现在知道它是如何工作的了,但是你会为 PHP 推荐什么来确定业务是“是的,我们是开放的”还是“抱歉我们已经关闭了”。感谢您的帮助。
      • 对不起,我是个害虫,但我怎么能找到 $timeOpenFromDB 和 $timeCloseFromDB 因为使用当前代码,它只是抓住最近的时间......
      • 当前代码应该返回两行。我将使用附加的伪程序更新代码。
      猜你喜欢
      • 2022-12-26
      • 2022-11-20
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多