Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql将时间分割为查询中的时间段_Php_Mysql_Timeslots - Fatal编程技术网

Php Mysql将时间分割为查询中的时间段

Php Mysql将时间分割为查询中的时间段,php,mysql,timeslots,Php,Mysql,Timeslots,我有一个MySQL表,其中包含可用时间: ID from till day 1 540 720 1 2 780 960 1 ... 起止时间仅为午夜后的分钟数,如上午9点=9*60=540,以此类推 对于不同的提供商,从到的时间可能不同,时隙也可能不同 我需要做的是做一个查询,从这个表中选择结果,并将结果拆分为时间段 例如,一个时间段为60分钟,结果应如下所示: from till day 540 600 1 600 660

我有一个MySQL表,其中包含可用时间:

ID  from   till   day
1   540    720    1
2   780    960    1
...
起止时间仅为午夜后的分钟数,如上午9点=9*60=540,以此类推

对于不同的提供商,
到的时间可能不同,时隙也可能不同

我需要做的是做一个查询,从这个表中选择结果,并将结果拆分为时间段

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

from   till   day
540    600    1
600    660    1
660    720    1
780    840    1
...
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;
你对我如何在MySQL中做到这一点有什么想法吗


提前谢谢。

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

from   till   day
540    600    1
600    660    1
660    720    1
780    840    1
...
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;
您的查询如下所示:

from   till   day
540    600    1
600    660    1
660    720    1
780    840    1
...
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;
选择ts.start\u时间、ts.end\u时间、avt.day
作为avt的可用时间
加入时隙
ON avt.from=ts.start\U时间
按ts开始时间订购;

我不确定您所有的连接都是什么,因为我不知道您的模式,但基于有限的信息,我相信这会有所帮助

如果有如下所示的带有外键提供程序ID的时隙表,它可能如下所示。我已经包括了DATETIME字段,因为如果某个时段是35分钟或类似的时间,这些字段可能会帮助您查询准确的时间。MySQL附带了一些日期函数,可以帮助您解决问题,而不是试图在几分钟内从开始到结束使用。(在本例中,我从和直到离开,但这些可能不需要)

鉴于下表:

表:时隙

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
您可以使用以下可能的查询来获取时隙信息并显示提供者信息。在执行查询之前,可以根据代码中的某些逻辑将间隔类型及其值传递到查询中。通过在代码中循环,您可以收集到您当时感兴趣的所有时间段

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日期函数:


对不起,应该有840个PHP标记,所以我假设您在这个项目中使用的是PHP。使用脚本语言(如PHP)比单独使用MySQL更好地处理此任务。是的,我考虑过这一点,但此查询还需要几个连接来返回正确的数据。例如,每个有约会的时间段也应该返回约会详细信息。问题是不同提供商的时间段可能不同,创建另一个表的效率不高。啊,好的。你为什么不在问题中添加更多关于时间段的信息,让人们更好地了解他们是如何工作的呢。例如,是否只是时间长度因供应商而异?或者开始/结束时间也不同?是的,开始/结束时间也不同。现在我正在考虑为可用时间生成时间段。