【问题标题】:Timespan - Check for weekday and time of day in mysql时间跨度 - 检查 mysql 中的工作日和一天中的时间
【发布时间】:2012-02-06 19:54:12
【问题描述】:

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

例如: 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

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

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

编辑:

这是到目前为止的结果。 starttid = 开始时间,sluttid = 结束时间。 Ovrig_tid 在不是任何特定时间时使用。 startdag = 一周的开始日期,slutdag = 一周的结束日期。 0 = 星期一,6 = 星期日。所以结果应该是每个bolag_id 中的最大一个。

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

【问题讨论】:

    标签: php mysql time timespan


    【解决方案1】:

    编辑 - 修改以满足 cmets 中指定的条件(结束时间):

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

    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 |
    +--------+---------+-------------+------+
    

    【讨论】:

    • 不是我真正想要的。我需要结束时间,以便检查脚本执行的时间是否在时间跨度和一周中的正确日期之间。
    • 修改了我的答案,希望能更好地满足您的需求。
    • 已添加图片。也许它可以让我对我想要的有所了解。
    • 可能值得注意的是,如果您使用我的示例(我认为它非常适合您的标准),我会将“rateEndTime”重命名为“rateValidUntil”并将“
    • 我明天会检查更多。看到我应该怎么做才能轻松添加新费率时遇到了一点麻烦。我现在拥有的最佳方式是添加开始时间、结束时间、开始日期、结束日期。 php 脚本负责其余的工作。我可以用这个做类似的事情吗? (这可能很容易。我只是现在想不清楚:P)
    【解决方案2】:

    为了使这变得非常简单,您可以使用类似于以下架构的内容:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 2021-10-15
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多