Door
Liefhebber Laravel
op 15-11-2016 08:54
gewijzigd op 15-11-2016 08:54
3.733 views
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!)
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?
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?
[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.
select *, timediff(end,start) as uren from events;
select *, date_format(start,'%Y-%c-%d') as dag, sum(timediff(end,start)) as uren from events group by dag;
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
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.
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'