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

Php Timespan-检查mysql中的工作日和时间,php,mysql,time,timespan,Php,Mysql,Time,Timespan,我需要有一个数据库,在一天的不同时间和不同的工作日具有不同的速率 例如: 周一到周五10:00到16:00之间我有一个价格。 星期一到星期五的16:00到10:00之间,我有另一个。周末还有另一种价格。 问题是时间过了午夜 我四处寻找解决办法。我找到了这条我认为对我有用的线索,但它没有。至少我不能让它按我所希望的那样工作。 我尝试的另一个解决方案也不起作用。它将时间存储为mysql中的时间,并检查时间和日期是否在数据库中的时间跨度之间。这也不起作用,因为我没有找到一个很好的解决方案来解决时间跨

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

例如:
周一到周五10:00到16:00之间我有一个价格。
星期一到星期五的16:00到10:00之间,我有另一个。周末还有另一种价格。

问题是时间过了午夜

我四处寻找解决办法。我找到了这条我认为对我有用的线索,但它没有。至少我不能让它按我所希望的那样工作。

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

我应该如何解决这个问题?数据库应该是什么样的,查询得到数据应该是什么样的

编辑:

以下是目前为止的情况
starttid
=开始时间,
slattid
=结束时间
Ovrig_tid
在不是任何特定时间时使用<代码>开始日期=一周的开始日期,
结束日期
=一周的结束日期。0=周一,6=周日。因此,结果应该是每个
bolag\u 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
;

要使这一点变得非常简单,您可以使用以下模式:

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

不是我想要的。我需要结束时间,以便检查脚本执行的时间是否介于时间跨度和一周中的正确日期之间。修改了我的答案,希望更好地满足您的需要。现在已添加图片。也许它能让我对我想要的东西有一些了解。可能值得注意的是,如果你使用我的例子(我认为这很符合你的标准),我会将“rateEndTime”重命名为“rateValidUntil”,并将“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