【问题标题】:Storing Time Ranges in mySQL database and comparing with Current time在 mySQL 数据库中存储时间范围并与当前时间进行比较
【发布时间】:2011-05-19 18:57:53
【问题描述】:

我有一个数据库表,将商店的营业时间作为时间范围存储为 VARCHAR,例如“上午 9 点至下午 5 点”和“上午 9 点至下午 3 点,下午 5 点至晚上 11 点”。我想将这些营业时间与当前时间进行比较,所以如果当前时间是下午 2 点,我将使用 PHP 回显一条说明商店现在营业的文本,如果当前时间是晚上 11.30,则会显示该商店关闭。

  1. 如何将当前时间与表格中的营业时间时间范围进行比较
  2. 我存储时间范围的方法合适吗?

我正在使用 Codeigniter,所以如果有有用的功能也请告诉我!

【问题讨论】:

  • 最好将其存储在 MySQL 中,以便使用 MySQL 日期/时间函数。

标签: php javascript mysql codeigniter time


【解决方案1】:

您应该使用 2 列(一列用于开放时间,一列用于关闭时间)均使用 TIME 数据类型:http://dev.mysql.com/doc/refman/5.1/en/time.html

通过这样做,您可以使用BETWEENNOW()SELECT * FROM shop WHERE CAST(NOW() AS TIME) BETWEEN open_time AND close_time;

编辑以包含表定义:

CREATE TABLE shop_hours (
  shop_id INT UNSIGNED NOT NULL,
  day_of_week INT UNSIGNED NOT NULL, -- 0-6
  open_time TIME NOT NULL,
  close_time TIME NOT NULL,
  PRIMARY KEY(shop_id, day_of_week, open_time, close_time)
);

【讨论】:

  • 我应该如何处理像“上午 9 点到下午 1 点、下午 3 点到 9 点”这样的休息时间?
  • 有些商店只有一个时间范围,有些有两个,所以我需要一种通用的方法,适用于单个和多个时间范围
  • 每个商店的多行将支持这一点。您的 PK 必须包含 shop_id, open_time, close_time
  • 我认为有一个额外的行可能会增加查询时间,因为每一行都有很长的公式要计算,并且对于额外的时间范围有重复的行可能是计算密集型的。
  • 如果我决定最多有 2 个时间范围,那么 4 列是否适用于 open_time_1、close_time_1、open_time_2、close_time_2?
【解决方案2】:

我强烈建议改为使用两个单独的列,一列用于开放时间,另一列用于关闭时间。

【讨论】:

    【解决方案3】:

    使用 24 小时格式的两列。计算机处理起来更明智,您将能够使用标准的数值比较。打印时始终可以转换为 AM/PM。

    【讨论】:

      猜你喜欢
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多