2013-11-20 12 views
5

Ich versuche, die freie Zeit Slots für einen Tag zu finden, aber ich bin auf der richtigen Abfrage stecken. Die Öffnungszeiten oder der Tag läuft zwischen 9:00 bis 22:00 jeden Tag die folgende Abfrage gibt die richtigen Daten durch den Tag, außer wenn die erste der Buchung des Tages um 10:00 Uhr ist, wird nicht die nicht gebuchten Slot zwischen 9:00 und 10:00 Uhr und wenn es von 21:30 bis 21:40 Uhr gebucht wird, wird nicht der letzte freie Platz angezeigt.Mysql Finden Sie freie Zeit Slots zwischen Terminen

in der Minute, um dies für jeden Tag zu umgehen und set_id ich muss einen Tag beginnen und Tag 1 Minute Eintrag im Einsatz als ID = 1 und ID = 6 dargestellt.

Ich versuche, aus, die erstellen, um diese beiden Einsätze für jeden Tag, um weg und jeder set_id

CREATE TABLE bookings 
(`id` int, `time_from` datetime, `time_to` datetime, `set_id` int); 


INSERT INTO bookings 
    (`id`, `time_from`, `time_to`, `set_id`) 
VALUES 
    (1, '2013-11-20 08:59:00', '2013-11-20 09:00:00', 6), 
    (2, '2013-11-20 09:10:00', '2013-11-20 10:00:00', 6), 
    (3, '2013-11-20 11:10:00', '2013-11-20 11:30:00', 6), 
    (4, '2013-11-20 12:00:00', '2013-11-20 12:40:00', 6), 
    (5, '2013-11-20 16:20:00', '2013-11-20 16:50:00', 6), 
    (6, '2013-11-20 22:00:00', '2013-11-20 22:01:00', 6) 
; 

SELECT Available_from, Available_to 
FROM (
    SELECT @lasttime_to AS Available_from, time_from AS Available_to, @lasttime_to := time_to 
    FROM (SELECT time_from, time_to 
      FROM bookings 
      WHERE set_id = 6 
      AND time_to >= '2013-11-20 08:59' 
      AND time_from < '2013-11-20 22:01' 
     ORDER BY time_from) e 
    JOIN (SELECT @lasttime_to := NULL) init) x 
WHERE Available_to > DATE_ADD(Available_from, INTERVAL 9 MINUTE); 


|  AVAILABLE_FROM |     AVAILABLE_TO | 
|---------------------|---------------------------------| 
| 2013-11-20 09:00:00 | November, 20 2013 09:10:00+0000 | 
| 2013-11-20 10:00:00 | November, 20 2013 11:10:00+0000 | 
| 2013-11-20 11:30:00 | November, 20 2013 12:00:00+0000 | 
| 2013-11-20 12:40:00 | November, 20 2013 16:20:00+0000 | 
| 2013-11-20 16:50:00 | November, 20 2013 22:00:00+0000 | 

jede mögliche Hilfe würde geschätzt.

http://www.sqlfiddle.com/#!2/b30a0/2

CREATE TABLE `days` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `date` date NOT NULL, 
    `time_from` datetime NOT NULL, 
    `time_to` datetime NOT NULL, 
    `step` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 


INSERT INTO `days` (`id`, `date`, `time_from`, `time_to`, `step`) 
VALUES 
    (1, '2013-11-20', '2013-11-20 09:00:00', '2013-11-20 22:00:00', 10), 
    (2, '2013-11-21', '2013-11-21 09:00:00', '2013-11-21 22:00:00', 10); 

A Little Closer!

INSERT INTO `bookings` (`id`, `date`, `time_from`, `time_to`, `set_id`, `name`, `email`, `telephone`, `amount`, `notes`, `is_paid`, `is_booked`) 
VALUES 
    (25, '2013-11-20', '2013-11-20 09:10:00', '2013-11-20 09:30:00', 1, '', '', '', NULL, NULL, 0, 0), 
    (26, '2013-11-20', '2013-11-20 10:30:00', '2013-11-20 11:30:00', 1, '', '', '', NULL, NULL, 0, 0), 
    (27, '2013-11-20', '2013-11-20 12:30:00', '2013-11-20 13:20:00', 1, '', '', '', NULL, NULL, 0, 0), 
    (29, '2013-11-20', '2013-11-20 15:00:00', '2013-11-20 16:40:00', 1, '', '', '', NULL, NULL, 0, 0); 

Das ist, was ich

availableFrom   availableTo 
9:00     2013-11-20 09:10:00 
2013-11-20 09:30:00  2013-11-20 10:30:00 
2013-11-20 11:30:00  2013-11-20 12:30:00 
9:00     2013-11-20 15:00:00 
2013-11-20 15:00:00  22:00 
+0

Vielen Dank für die Antwort, wo würde ich brauche Die Union? – Tim

+0

Ich habe eine Tabelle Tage mit ID, Datum, time_from, time_to, Schritt – Tim

+0

also ID = 1, Datum = 2013-11-20, time_from = 2013-11-20 09:00:00, time_to = 2013-11- 20, step = 10 – Tim

Antwort

0

Eine Möglichkeit bekommen, ist mit sich selbst der Tisch nach links-Join etwas in dieser Richtung:

select (case when ltime_to is null then '9:00' else ltime_to end) as availableFrom, 
rtime_from as availableTo 
from (select l.time_to as ltime_to, r.time_from as rtime_from from bookings r 
left join bookings l on l.id=r.id-1) lr 
union 
select max(time_from) as availableFrom, '22:00' as availableTo from bookings 
+0

Nein, so Runde gibt nichts zurück. – Tim

+0

Ah ich sehe, nicht sofort was du machst. Eine der einfachen albernen Weisen wäre, eine falsche Buchung einzufügen, die im ersten Moment des Tages beginnt und stoppt, die Sie dann als das erste time_from verwenden könnten. Andere Option, wenn Sie garantieren, dass Ihre Tabelle nicht überlappende aufeinander folgende Perioden hat, könnte sein, LINKE VERBINDEN Sie die Tabelle mit sich selbst auf l.id = r.id-1 und dann entweder vorherige time_from oder Beginn des Tages als time_from verwenden. – Ashalynd

+0

danke dafür, die falschen Einträge sind, was die ersten und letzten Einträge sind auf der Einfügung oben - id 1 & 6 Sie werden bemerken, sie sind nur 1 Minute Buchungen. Das ist es, wovon ich versuche wegzukommen, weil ich diese betrügerischen Buchungen für 6 Orte oder set_id's jeden Tag erstellen muss. und dachte, es muss eine Möglichkeit geben, eine Start- und Endzeit in die Abfrage zu integrieren, damit ich die falschen Inserts nicht machen muss. (Ich mag den Namen gefälscht!) Ich habe die Start- und Endzeiten in der Tabelle Tage, die ich verwenden könnte? danke – Tim

Verwandte Themen