0

我有一个可用时间的 MySQL 表:

ID  from   till   day
1   540    720    1
2   780    960    1
...

from 和 until 时间只是从午夜开始的分钟数,例如 9AM = 9*60 = 540 等等。

不同提供商的时间fromtill时间可能不同,时间段也可能不同。

我需要做的是进行一个查询,从这个表中选择结果,分成时间段。

例如,一个时间段为 60 分钟,结果应如下所示:

from   till   day
540    600    1
600    660    1
660    720    1
780    840    1
...

你知道我如何在 MySQL 中做到这一点吗?

提前致谢。

4

2 回答 2

0

我不确定您的所有 JOINS 会是什么,因为我不知道您的架构,但基于有限的信息,我相信这会有所帮助。

如果有一个如下所示的带有外键 PROVIDER_ID 的时隙表,它可能看起来像这样。我已经包含了 DATETIME 字段,因为如果插槽是 35 分钟或类似的时间,这些字段可能会在您尝试查询确切时间时帮助您。MySQL 带有一些 DATE 函数,可以帮助您,而不是在几分钟内尝试使用 FROM 和 TILL。(在这个例子中我已经离开了 FROM 和 TILL 但这些可能不需要)

给定下表:

表:time_slots

ID  FROM TILL DAY FROM_TIME             TO_TIME              PROVIDER_ID
1   540  630  1   2015-01-03 09:00:00   2015-01-03 10:30:00  4
2   780  960  1   2015-01-03 13:00:00   2015-01-03 16:00:00  16
3   600  660  2   2015-01-03 10:00:00   2015-01-03 11:00:00  7
4   660  720  1   2015-01-03 11:00:00   2015-01-03 12:00:00  9
5   780  840  2   2015-01-03 13:00:00   2015-01-03 14:00:00  12
6   600  630  3   2015-01-03 10:00:00   2015-01-03 10:30:00  14

表:提供者

ID  NAME
4   Provider 4
7   Provider 7
9   Provider 9
12  Provider 12
14  Provider 14
16  Provider 16

您可以使用以下可能的查询来获取时隙信息并显示提供者信息。在执行查询之前,您可以根据代码中的某些逻辑将 INTERVAL 类型及其值传递给查询。通过循环输入您的代码,您可以收集您目前感兴趣的所有时间段。

SELECT '60 Minute Slot', p.name, t.from_time, t.to_time, t.day 
FROM time_slots t 
JOIN providers p ON p.id = t.provider_id
WHERE DATE_ADD(from_time, INTERVAL 1 HOUR) = to_time

结果:

60 Minute Slot  Provider 7  2015-01-03 10:00:00 2015-01-03 11:00:00 2
60 Minute Slot  Provider 9  2015-01-03 11:00:00 2015-01-03 12:00:00 1
60 Minute Slot  Provider 12 2015-01-03 13:00:00 2015-01-03 14:00:00 2


SELECT '30 Minute Slot', p.name, t.from_time, t.to_time, t.day 
FROM time_slots t 
JOIN providers p ON p.id = t.provider_id
WHERE DATE_ADD(from_time, INTERVAL 30 MINUTE) = to_time

结果:

30 Minute Slot  Provider 14 2015-01-03 10:00:00 2015-01-03 10:30:00 3

您可以在此处查看 MySQL DATE 函数:

MySQL 日期函数

于 2015-01-04T23:02:24.223 回答
0

我会创建一个包含一天中所有时间段的表。它看起来像这样:

CREATE TABLE time_slots (
    time_slot_id INT(11) AUTO_INCREMENT,
    start_time INT(11),
    end_time INT(11)
);

您的查询将如下所示:

SELECT   ts.start_time, ts.end_time, avt.day

FROM     available_times AS avt

         JOIN time_slots ts
         ON avt.from <= ts.end_time AND avt.till >= ts.start_time

ORDER BY ts.start_time;
于 2015-01-04T04:13:19.353 回答