Datum Splitten
Hallo Forum,
erstmal frohe Ostern.
Ich bin am basteln und brauche einen Ansatz:
Ich möchte das Array splitten. Und zwar:
Wenn ein Zeitblock zB Pause innerhalb eines anderen Zeitblocks liegt, möchte ich den großen aufsplitten.
Bsp:
Ist
Zeitblock 1: 08:00 - 16:00
Zeitblock 2: 9:30-9:45
Soll:
Zeitblock 1: 08:00 -09:30
Zeitblock 2: 09:30 -09:45
Zeitblock 3: 09:45-16:00
// Pause um 9:30 15 Minuten und 12:30 30 Minuten
=>
Die Idee ist, das ganze in ein arry zu packen, zu durchlaufen und dann zu vergleichen und mittels if (start<ende) der vorangegangenen Schleife zu splitten. Aber das ist doch murks? Oder kann man via mysql da irgendwie rechnen? Was weiß ich das Ganze in Viertelstunden zerlegen, dann sortieren und dann umformatieren...
irgendeine Idee?
mfg
tsunami
erstmal frohe Ostern.
Ich bin am basteln und brauche einen Ansatz:
<?php
//************* Kathegori***********
//Array********* Kategorie, Start, Ende
/****
*
* Array: Anfahrt Array[1] 7:30 Start Array[2] Ende 8:00 Array[3] Datum 2019-02-19
* Array[1]: Kunde Array[1][1] 8:00 Start Array[1][2] Ende 16:00 Array[1][3] Datum 2019-02-19
* Array[2]: Pause 1 Array[2][1] 9:30 Start Array[2][2] Ende 9:45 Array[2][3] Datum 2019-02-19
* Array[3]: Pause 2 Array[3][1] 12:30 Start Array[3][2] Ende 13:00 Array[3][3] Datum 2019-02-19
* Array[4]: Rückfahrt Array[3][1] 16:00 Start Array[3][2] Ende 16:45 Array[4][3] Datum 2019-02-19
* ***
*/
$zeiten=array
(
array("1","7:30","8:00","2019-02-19"),
array("2","8:00","16:00","2019-02-19"),
array("1","9:30","9:45","2019-02-19"),
array("1","12:30","13:00","2019-02-19"),
array("1","16:00","16:45","2019-02-19")
);
foreach($zeiten as $peep)
{
foreach ($peep as $peng)
{
echo $peng." - ";
}
echo "<br/>";
}
?>
Ich möchte das Array splitten. Und zwar:
Wenn ein Zeitblock zB Pause innerhalb eines anderen Zeitblocks liegt, möchte ich den großen aufsplitten.
Bsp:
Ist
Zeitblock 1: 08:00 - 16:00
Zeitblock 2: 9:30-9:45
Soll:
Zeitblock 1: 08:00 -09:30
Zeitblock 2: 09:30 -09:45
Zeitblock 3: 09:45-16:00
// Pause um 9:30 15 Minuten und 12:30 30 Minuten
=>
$zeiten=array
(
array("1","7:30","8:00","2019-02-19"),
array("2","8:00","09:30","2019-02-19"),
array("2",09:30","09:45","2019-02-19"),
array("1","9:45","12:30","2019-02-19"),
array("1","12:30","13:00","2019-02-19"),
array("1","13:00","16:00","2019-02-19").
array("2","16:00","16:45","2019-02-19")
);
Die Zeiten liegen als time in ner Datenbank. Also
id | start | ende | kategorie_id
1 | 2019-02-01 07:30:00 | 2019-02-01 08:00:00 | 1
2 | 2019-02-01 08:00:00 | 2019-02-01 16:00:00 | 3
3 | 2019-02-01 09:00:00 | 2019-02-01 09:30:00 | 2
4 | 2019-02-01 12:30:00 | 2019-02-01 13:00:00 | 2
5 | 2019-02-01 16:00:00 | 2019-02-01 16:45:00 | 1
Die Idee ist, das ganze in ein arry zu packen, zu durchlaufen und dann zu vergleichen und mittels if (start<ende) der vorangegangenen Schleife zu splitten. Aber das ist doch murks? Oder kann man via mysql da irgendwie rechnen? Was weiß ich das Ganze in Viertelstunden zerlegen, dann sortieren und dann umformatieren...
irgendeine Idee?
mfg
tsunami
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 564744
Url: https://administrator.de/forum/datum-splitten-564744.html
Ausgedruckt am: 05.04.2025 um 01:04 Uhr
4 Kommentare
Neuester Kommentar
Hallo,
was mit dazu durch den Kopf geht.
1. Datenbank weil man da schön suchen kann
2. Ist das mit dem Endzeitpunkt bei jedem Block sinnvoll?
Du fängst an zu arbeiten und machst Dir einen Eintrag.
Wann der Eintrag endet weißt Du ja erst wenn er wirklich zu Ende ist.
Davor kommen ja die Pausen (oder telefonate mit anderen Kunden).
3. Gibt es sowas nicht schon fertig?
Ich notiere mit meist nur die Anfangs- und Endzeit.
Die Anfahrt wird pauschal berechnet anhand der Zeit und Kilometer laut Googlemaps.
Am Ende des Tages trage ich in mein System die Anfangs- und Endzeit sowie einen Abzug in Minuten.
Zurück zu Deiner Frage.
Arbeit 13.04.20 10:00 - 16:00, Abzug 0 -> 60 Minuten
Pause 13.04.20 11:30 - 11:45, Dauer 15 Minuten
Pause 13:04.20 14:00 - 14:45, Dauer 45 Minuten
Suche nach Einträgen die vor 16:00 begonnen haben oder nach 10:00 geendet haben und ziehe diese davon ab.
Eigentlich müßte Anfangs und Endzeit beide innerhalb der Arbeitszeit sein.
Von diesen Einträgen nimmtst Du die Zeit und trägst sie in das Feld Abzug der Arbeitszeit ein
Viel Spass
Stefan
was mit dazu durch den Kopf geht.
1. Datenbank weil man da schön suchen kann
2. Ist das mit dem Endzeitpunkt bei jedem Block sinnvoll?
Du fängst an zu arbeiten und machst Dir einen Eintrag.
Wann der Eintrag endet weißt Du ja erst wenn er wirklich zu Ende ist.
Davor kommen ja die Pausen (oder telefonate mit anderen Kunden).
3. Gibt es sowas nicht schon fertig?
Ich notiere mit meist nur die Anfangs- und Endzeit.
Die Anfahrt wird pauschal berechnet anhand der Zeit und Kilometer laut Googlemaps.
Am Ende des Tages trage ich in mein System die Anfangs- und Endzeit sowie einen Abzug in Minuten.
Zurück zu Deiner Frage.
Arbeit 13.04.20 10:00 - 16:00, Abzug 0 -> 60 Minuten
Pause 13.04.20 11:30 - 11:45, Dauer 15 Minuten
Pause 13:04.20 14:00 - 14:45, Dauer 45 Minuten
Suche nach Einträgen die vor 16:00 begonnen haben oder nach 10:00 geendet haben und ziehe diese davon ab.
Eigentlich müßte Anfangs und Endzeit beide innerhalb der Arbeitszeit sein.
Von diesen Einträgen nimmtst Du die Zeit und trägst sie in das Feld Abzug der Arbeitszeit ein
Viel Spass
Stefan
Hallo tsunami,
sammel Deine Start- und Endzeiten in eine Spalte, nur die verschiedenen. Dazu noch einen Autowert, dann kannst Du sie ganz einfach in die Blöcke aufteilen.
Von MySQL habe ich nicht so die Ahnung, in MS SQL würde das etwa so aussehen:
Das "union" sorgt dafür, daß nur die unterschiedlichen Zeiten gelesen werden, hat also quasi ein "distinct" mit eingebaut.
Ergebnis wäre eine Tabelle:
Die Blöcke bekommst Du dann mit:
Wie gesagt, ist nicht MySQL, aber als Anregung für das Vorgehen hoffentlich zu gebrauchen.
Gruß, Mad Max
sammel Deine Start- und Endzeiten in eine Spalte, nur die verschiedenen. Dazu noch einen Autowert, dann kannst Du sie ganz einfach in die Blöcke aufteilen.
Von MySQL habe ich nicht so die Ahnung, in MS SQL würde das etwa so aussehen:
create table #zeiten (id int identity, zeit datetime)
insert into #zeiten (zeit)
select start as zeit from tabelle
union
select ende as zeit from tabelle
order by zeit
Das "union" sorgt dafür, daß nur die unterschiedlichen Zeiten gelesen werden, hat also quasi ein "distinct" mit eingebaut.
Ergebnis wäre eine Tabelle:
id zeit
1 07:30
2 08:00
3 09:30
4 09:45
5 12:30
6 13:00
7 16:00
8 16:45
Die Blöcke bekommst Du dann mit:
select s.zeit as start,
e.zeit as ende,
(select top (1) kategorie_id from tabelle where start <= s.zeit and ende >= e.zeit order by start desc) as kategorie_id
from #zeiten s
join #zeiten e on e.id = s.id + 1
Wie gesagt, ist nicht MySQL, aber als Anregung für das Vorgehen hoffentlich zu gebrauchen.
Gruß, Mad Max