微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 在MySQL中存储时间范围并确定当前时间是否在时间范围内

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

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)
)

这样查询可能是这样的:

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,即商店表,那么过滤条件很可能必须更复杂,可能是这样的:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐