Timespan - проверка дня недели и времени суток в mysql - PullRequest
1 голос
/ 06 февраля 2012

Мне нужна база данных с разными тарифами в разное время суток и в разные дни недели.

Например: 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.

Проблема в том, что время переходит в полночь.

Я искал решение. Я нашел эту ветку, которая, как я думал, будет работать для меня, но это не так. По крайней мере, я не могу заставить его работать так, как я хочу. Работа со временем и после полуночи

Другое решение, которое я попробовал, тоже не сработало. Он должен был хранить время как время в mysql и проверять, было ли время и день между промежутком времени в базе данных. Это тоже не сработало, потому что я не нашел хорошего решения для того, когда промежуток времени превышает полночь.

Как мне попытаться решить эту проблему? Как должна выглядеть база данных и запрос для получения данных?

Edit:

Вот что он получил до сих пор. starttid = время начала, sluttid = время окончания. Ovrig_tid используется, когда это не определенное время. startdag = начальный день недели, slutdag = конечный день недели. 0 = понедельник, 6 = воскресенье. Таким образом, результат должен быть максимум один из каждых bolag_id.

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

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

РЕДАКТИРОВАТЬ - Изменено для соответствия критериям (время окончания), указанным в комментариях:

Я верю, что вы захотите сохранить дневную ставку отдельно. Сохраните по крайней мере одно значение с последней минутой данного дня в качестве окончательного показателя общего охвата (это будет единственная строка для дней с одним коэффициентом в течение всего дня). В любой конкретный день / время просто сверьтесь с этой таблицей, чтобы определить данный показатель для этого периода времени. Смотрите ниже:

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 голос
/ 07 февраля 2012

Чтобы сделать это действительно простым, у вас может быть что-то вроде следующей схемы:

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