php - 在MySQL中存储时间范围并判断当前时间是否在时间范围内

标签 php mysql sql codeigniter time

我有一个数据库表,以 TIME 格式存储商店的营业时间作为时间范围。例如,如果商店的营业时间是“上午 9 点至下午 5 点”,则将有 2 列“hours_open”和“hours_close”,我将 9:00 存储在“hours_open”中,将 17:00 存储在“hours_close”中。要确定商店当前是开门还是关门,我将运行查询:

SELECT * 
  FROM shop 
 WHERE CAST(NOW() AS TIME) BETWEEN hours_open AND hours_close;

我现在需要做的是为营业时间超过午夜(例如晚上 9 点至凌晨 3 点)的商店提供便利。此外,商店在不同的日子可以有不同的营业时间,例如:周一至周四:晚上 9 点至凌晨 3 点,周五至周日:晚上 9 点至凌晨 5 点。

现在我很困惑。我该如何进行?我每天可以有一对 'hours_open' 和 'hours_close',例如:'mon_hours_open'、'mon_hours_close'、'tue_hours_open'、'tue_hours_close' ...

但我如何处理午夜 9 点到凌晨 5 点之后的营业时间?

有什么见解吗?如果有帮助,我将使用 PHP 和 Codeigniter 框架。

最佳答案

如果将时间存储在单独的表中,则检查时间会更容易,例如

shop_working_hours (
  shop_id int FK,
  day_of_week int,
  hours_open time,
  hours close time,
  PK (shop_id, day_of_week)
)

That way the query might be like this:

SELECT s.*
FROM shop s
  INNER JOIN shop_working_hours h ON s.id = h.shop_id
WHERE
  CASE
    WHEN h.hours_close > h.hours_open THEN
      h.day_of_week = DAYOFWEEK(NOW()) AND
      CAST(NOW() AS time) >= h.hours_open AND CAST(NOW() AS time) < h.hours_close
    ELSE
      h.day_of_week = DAYOFWEEK(NOW() - 1) AND
      CAST(NOW() AS time) >= h.hours_open OR CAST(NOW() AS time) < h.hours_close
  END

但是,如果您更愿意在同一个表中为一周中的每一天使用多个列,例如 *_hours_open*_hours_close,即 shop 表,那么过滤条件很可能必须更复杂,可能是这样的:

SELECT s.*
FROM shop s
  CROSS JOIN (
    SELECT 1 AS day_of_week
    UNION ALL SELECT 2
    UNION ALL SELECT 3
    UNION ALL SELECT 4
    UNION ALL SELECT 5
    UNION ALL SELECT 6
    UNION ALL SELECT 7
  ) h
WHERE
  CASE h.day_of_week
    WHEN 1 THEN
      CASE
        WHEN s.mon_hours_close > s.mon_hours_open THEN
          h.day_of_week = DAYOFWEEK(NOW()) AND
          CAST(NOW() AS time) >= s.mon_hours_open AND
          CAST(NOW() AS time) < s.mon_hours_close
        ELSE
          h.day_of_week = DAYOFWEEK(NOW() - INTERVAL 1 DAY) AND
          CAST(NOW() AS time) >= s.mon_hours_open OR
          CAST(NOW() AS time) < s.mon_hours_close
      END
    WHEN 2 THEN
      CASE
        WHEN s.tue_hours_close > s.tue_hours_open THEN
        …  /* same for Tuesday */
      END
    …  /* and for all the other days of week */
  END

关于php - 在MySQL中存储时间范围并判断当前时间是否在时间范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6237898/

相关文章:

php - 获取与所选游戏具有相同类别的所有游戏

php - 在线或离线功能 PHP

php - 如何从返回 3 维数组的查询中获取数据并在 symfony 3 中的 Twig View 上设置值

sql - 今天最新和昨天最新记录

sql - 给定年份创建的所有表的打印大小

PHP - 在文件中查找一个字符串然后显示它的行号

PHP mysql_fetch_array 不起作用?

php - 如何在 PHP 中将日期和时间字符串转换为当前时区日期

php - 使用PHP while循环将数据插入Mysql

SQL - 获取包含特定列中数据的最新行,或者如果该列中没有数据则仅获取最新行