我需要一个在一天中不同时间和不同工作日具有不同费率的数据库。
例如:
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.
问题是当时间超过午夜时。
我四处寻找解决方案。我发现这个线程我认为对我有用,但事实并非如此。至少我无法让它按照我想要的方式工作。 处理时间和午夜之后
我尝试的其他解决方案也不起作用。是将时间作为TIME存储在mysql中,并检查时间和日期是否在数据库中的时间跨度之间。这也没有成功,因为当时间跨度超过午夜时我没有找到好的解决方案。
我应该如何尝试解决这个问题?数据库应该是什么样子以及获取数据的查询?
编辑:
这是到目前为止的结果。
starttid
= 开始时间,sluttid
= 结束时间。当不是任何特定时间时使用 Ovrig_tid
。 startdag
= 一周的开始日,slutdag
= 一周的结束日。 0 = 星期一,6 = 星期日。所以结果应该是每个 bolag_id
中最多有一个。
编辑 - 修改以满足评论中指定的标准(结束时间):
我相信您想要做的是单独存储每天的费率。至少存储一个给定日期最后一分钟的值作为最终的包罗万象的费率(这将是全天具有单一费率的日期的唯一行)。在任何给定的日期/时间,只需查阅此表即可确定该时间段的给定费率。见下图:
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 |
+--------+---------+-------------+------+
为了让这个变得非常简单,你可以有类似以下的模式:
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