Timespan - 在mysql中检查工作日和时间

时间:2012-02-06 19:54:13

标签: php mysql time timespan

我需要在不同的时间和不同的工作日拥有一个不同费率的数据库。

例如: Between 10:00 and 16:00 monday to friday I have one rate. Between 16:00 and 10:00 monday to friday I have another. And on the weekends there is another rate.

问题是时间过了午夜。

我四处寻找解决方案。我发现这个帖子我认为对我有用,但事实并非如此。至少我不能像我想要的那样让它工作。 Dealing with times and after midnight

我试过的另一个解决方案也没有用。它是在mysql中将时间存储为TIME,并检查时间和日期是否在数据库中的时间跨度之间。这也没有用,因为我没有找到一个很好的解决方案,当时间跨度超过午夜。

我该如何解决这个问题?数据库应该是什么样的以及获取数据的查询?

编辑:

这是迄今为止的结果。 starttid =开始时间,sluttid =结束时间。如果不是特定时间,则使用Ovrig_tidstartdag =开始星期几,slutdag =结束日期。 0 =星期一,6 =星期日。因此,结果应该是每bolag_id个最大值。

http://desmond.imageshack.us/Himg829/scaled.php?server=829&filename=example1tm.jpg&res=medium

2 个答案:

答案 0 :(得分:2)

编辑 - 修改为符合评论中指定的标准(结束时间):

我相信你想要做的就是分别存储每一天的费率。在给定日期的最后一分钟存储至少一个值作为最终的全部收费率(这将是全天单一费率的天数的唯一行)。在任何给定的日期/时间,只需查阅此表以确定该段时间内的给定费率。见下文:

DROP TABLE IF EXISTS tRate;
CREATE TABLE tRate (
    rateId         INT(11) UNSIGNED NOT NULL auto_increment,
    rateDay        TINYINT(1),
    rateEndTime  TIME,
    rate           DECIMAL(9,2),
    PRIMARY KEY (rateId)
)
;

INSERT INTO tRate VALUES
(NULL, 0, '00:10:00', '0.80'),
(NULL, 0, '23:59:59', '0.90'),
(NULL, 1, '00:10:00', '0.90'),
(NULL, 1, '00:16:00', '0.75'),
(NULL, 1, '23:59:59', '0.90')
-- (etc. for all days 0-6)
;

SET @execDay  = DATE_FORMAT(NOW(), '%w');       -- 1 in the case of today for the resultset below
SET @execTime = DATE_FORMAT(NOW(), '%H:%m:%s'); -- 14:02:33 at the time this example was run

鉴于此数据,以下查询:

SELECT *
FROM
    tRate
WHERE
    rateDay = @execDay
    and @execTime < rateEndTime
;

返回特定执行时间的结果集:

+--------+---------+-------------+------+
| rateId | rateDay | rateEndTime | rate |
+--------+---------+-------------+------+
|      5 |       1 | 23:59:59    | 0.90 |
+--------+---------+-------------+------+

答案 1 :(得分:1)

为了使这非常简单,您可以使用以下架构:

rate_by_hour
--------------------------------------
day     hour     rate
--------------------------------------
1       0        1.00
1       1        1.00
...
1       23       1.50
2       0        1.10
2       1        1.10
...

因此,对于一周中的每一天,您都按小时分隔费率。

此外,对于每个可计费项目,您每小时只有一行:

charge_per_hour
----------------------------------------
user_id     date        hour   hour_used
----------------------------------------
1           2012/02/01  23      0.25
1           2012/02/02  0       1.00
1           2012/02/02  1       0.25

以下是计算总数的查询:

SELECT SUM(c.hour_used * r.rate)
FROM charge_per_hour c
LEFT JOIN rate_by_hour r
ON r.day = DAYOFWEEK(c.date)
  AND r.hour = c.hour
WHERE user_id = 1