我需要在不同的时间和不同的工作日拥有一个不同费率的数据库。
例如:
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_tid
。 startdag
=开始星期几,slutdag
=结束日期。 0 =星期一,6 =星期日。因此,结果应该是每bolag_id
个最大值。
http://desmond.imageshack.us/Himg829/scaled.php?server=829&filename=example1tm.jpg&res=medium
答案 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