Hoi,

Kunnen jullie me even helpen om een juiste query op te bouwen: Dit is mijn tabel met evenementen:
(Weet dat de echte tabel ongeveer 3000 evenementen bevat!)

[table]
[tr][td]id[/td][td]title[/td][td]start[/td][td]end[/td][/tr]
[tr][td]10[/td][td]evenement1[/td][td]2016-11-05 08:00:00[/td][td]2016-11-05 10:00:00[/td][/tr]
[tr][td]11[/td][td]evenement2[/td][td]2016-11-06 09:00:00[/td][td]2016-11-06 12:00:00[/td][/tr]
[tr][td]12[/td][td]evenement3[/td][td]2016-11-06 14:00:00[/td][td]2016-11-06 16:00:00[/td][/tr]
[tr][td]13[/td][td]evenement4[/td][td]2016-11-08 10:00:00[/td][td]2016-11-06 12:00:00[/td][/tr]
[tr][td]14[/td][td]evenement5[/td][td]2016-11-08 10:00:00[/td][td]2016-11-06 12:00:00[/td][/tr]
[/table]

Ik zou een lijst willen verkrijgen van alle uren / gegroepeerd per dag dat er zich een evenement voordeed.
Dus: de lijst die ik hier wil verkrijgen is:

  • [li]Datum: 2016-11-05 - Aantal uren: 2:00:00[/li]
    [li]Datum: 2016-11-06 - Aantal uren: 5:00:00[/li]
    [li]Datum: 2016-11-08 - Aantal uren: 2:00:00[/li]


Merk op dat op datum 6/11 2 evenementen waren, die opgeteld zijn
Merk op dat op datum 8/11 ook 2 evenementen waren maar dat die overlapten, en deze zijn dus samengeteld !!

Kunnen jullie me een query bezorgen die dit resultaat geeft?

Alvast bedankt!

Groetjes!
Probeer het eens met :

sum( end-uur - start-uur  )


en :

group by start-datum
Hoi Adoptive Solution,

Dit lijkt te werken, ik krijg dan wel de tijd terug als een integer. Bijvoorbeeld 5:30 uren verschil wordt getoond als 53000
Bestaat er een functie om dit terug om te zetten naar 05:30:00 of moet ik de : er via SUBSTRING tussenplaatsen?
Ik zag de vraag al aankomen.

Met behulp van date_format() kan je het verfijnen.

Hier een voorbeeld van een bestand (zonder datum) met begin- en eindtijd die de totaal uren opsomt per heel uur :

SELECT *, date_format(begin,'%H') AS uur, SUM(date_format(einde,'%H') - date_format( begin, '%H')) AS uren FROM afspraken GROUP BY uur
Naar het voorstel van Adaptive Solution:
volgende SQL geeft niet het juiste resultaat:


SELECT DATE(start) AS datum, SUM( TIME(end) - TIME(start)) as tijd FROM events GROUP BY start


Resultaat:
[table]
[tr][td]datum[/td][td]tijd[/td][/tr]
[tr][td]2016-11-05[/td][td]20000[/td][/tr]
[tr][td]2016-11-06[/td][td]30000[/td][/tr]
[tr][td]2016-11-06[/td][td]20000[/td][/tr]
[tr][td]2016-11-08[/td][td]40000[/td][/tr]
[/table]

  • [li]datum 06/11 komt in 2 regels voor, en dit moet opgeteld zijn[/li]
    [li]datum 08/11 wordt als 40000 (4:00h) weergegeven terwijl dit maar 2:00 moet zijn (deze overlappen)[/li]




[size=xsmall]Toevoeging op 15/11/2016 14:04:27:[/size]

Hier eventueel de code om de tabel lokaal te importeren. Om te testen indien nodig.


DROP TABLE IF EXISTS `events`;
CREATE TABLE `events` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(20) DEFAULT NULL,
  `start` datetime DEFAULT NULL,
  `end` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO `events` VALUES ('1', 'evenement1', '2016-11-05 08:00:00', '2016-11-05 10:00:00');
INSERT INTO `events` VALUES ('2', 'evenement2', '2016-11-06 09:00:00', '2016-11-06 12:00:00');
INSERT INTO `events` VALUES ('3', 'evenement3', '2016-11-06 14:00:00', '2016-11-06 16:00:00');
INSERT INTO `events` VALUES ('4', 'evenement4', '2016-11-08 10:00:00', '2016-11-08 12:00:00');
INSERT INTO `events` VALUES ('5', 'evenement5', '2016-11-08 10:00:00', '2016-11-08 12:00:00');

Hoi Adaptive Solution,

Deze query geeft nog steeds de foute resultaten... bij 8/11 telt hij 4 uren, maar dat zou 2 moeten zijn omdat die overlappen...

bedankt voor je tijd alvast!
die overlap is nu net wat het zo ontzettend ingewikkeld maakt.

van 14 tot 16 uur en van 17 tot 20 uur is gewoon een optelling
van 14 tot 16 uur en van 15 uur tot 18 uur is het verschil tussen 18 en 14.

Daar kun je mogelijk nog een mooie formule op loslaten die bepaalt of het eerste tijdstip van de 2e event kleiner is dan de eindtijd van de eerste, maar dan zit je nog weer te kijken met de situatie waarbij event 1 pas begon na event 2

en zo'n formule moet overweg kunnen met

--------   
           +++++++
en
------------
         +++++++
en
-------------
  +++++
en
-------
+++++++
en
   -----
+++++
en 
     ----
++++


en is het ook nog mogelijk dat er meer dan 2 events op een dag zijn?




[size=xsmall]Toevoeging op 15/11/2016 17:07:59:[/size]

Naast DATE_FORMAT() bestaat ook de functie HOUR()
Die is misschien wat mooier om het uur te bepalen?

BTW: gewoon GROUP BY in een query gooien, zeker als er ook nog SELECT * in de query voorkomt, leidt al gauw tot rare resultaten die soms toevallig geven wat je zocht, maar mogelijk niet altijd
Hoi Ivo P en anderen,

bedankt voor je reactie! Inderdaad, die overlap maakt het ingewikkeld. Ik denk dat ik best alle data per dag binnenhaal, en op PHP hoogte even vergelijk met elkaar, om zo het juiste aantal uren te bepalen.

Ik vul nu een array als volgt op:


[03-11-2016] => Array
(
 [start] => Array
     (
         [0] => 12:25:00
         [1] => 14:55:00
         [2] => 19:00:00
     )
 [end] => Array
     (
         [0] => 14:30:00
         [1] => 17:25:00
         [2] => 20:45:00
     )
)


start[0] en end[0] is bv de eerste evenementtijd.
bestaat er een logica/formule om deze te vergelijken en zo het aantal actieve uren te berekenen?

NB; de uren zijn steeds gesorteerd van vroeg naar laat.

[size=xsmall]Toevoeging op 16/11/2016 09:24:33:[/size]

Heren,

ik heb net deze link gevonden: Klik hier

Hier staat een mySQL query die doet wat ik nodig heb! Maar ik krijg hem niet aangepast naar mijn tabel: hier is mijn query:


select DATE(start) as date, TIME_FORMAT(SEC_TO_TIME(sum(secs)), '%h:%i')
from (select t.*, 
             @time := if(@sum = 0, 0, TIME_TO_SEC(TIMEDIFF(TIME(start), @prevtime))) as secs,
             @prevtime := TIME(start),
             @sum := @sum + isstart
      from ((select DATE(start), TIME(start), 1 as isstart
             from events t
            ) union all
            (select DATE(start), TIME(end), -1
             from events t
            )
           ) t cross join
           (select @sum := 0, @time := 0, @prevtime := 0) vars
      order by 1, 2
     ) t
group by date;


Ik krijg de foutmelding "Unknown column 'start' in 'field list'

Aan de SQL specialisten: Wat doe ik fout?
Alternatieve oplossing: sla (afleidbare) tussenresultaten op: introduceer een extra kolom met de tijdsduur. Dit maakt je query vele malen eenvoudiger.

Reageren