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

问题描述 投票:0回答:2

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

例如:

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
中最多有一个。

php mysql time timespan
2个回答
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
投票

为了让这个变得非常简单,你可以有类似以下的模式:

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
© www.soinside.com 2019 - 2024. All rights reserved.