tsunami
Goto Top

Datum Splitten

Hallo Forum,
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

Content-Key: 564744

Url: https://administrator.de/contentid/564744

Printed on: April 26, 2024 at 03:04 o'clock

Member: StefanKittel
StefanKittel Apr 13, 2020 at 16:01:16 (UTC)
Goto Top
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
Member: tsunami
tsunami Apr 14, 2020 at 08:26:05 (UTC)
Goto Top
Guten Morgen,
erstmal vielen Dank für Deine superschnelle Antwort.
Zu 1 Ja. Datenbank steht dahinter.
Zu 2. Ich denke ja, das Ziel ist nachher sowas wie eine Effektivitätsübersicht. Also eine Art Monatsübersicht wo ich die Tätigkeitsblöcke als farbige divs darstelle. Die Positionen kann ich nicht fix machen, da ich die Uhrzeit-Spalte dynamisch nach Min und Max halten will. Also früheester Arbeitsbeginn und spätester Feierabend. Nun gibt man die Zeite ein. Normalerweise könnte man die Divs einfach übereinander legen. Das geht aber nur wenn das Parent absolute positioniert wird. Und das würde mich die Flexibilität kosten.
Daher die Idee, dass man die Eingaben so umbiegt, dass man immer einzelne Blöcke hat. Der User gib halt ein:
- Anfahrt 07:30- 07:45
- Kunde 07:45-16:00
- Pause 12:30-13:00
usw.

Die EIngaben empfange ic und mache draus ein mehrdimensionales Array. Das Array "Kunde" müste ich dann ändern:
- Kunde 07:45-12:30 Also das ende mit dem Startzeitppunkt der Pause ersetzen. Dann einen EIntrag hinzufügen:
- Kunde 13:00-16:00
Das ganze dann in die Datenbank. Die kann ich dann mit order by startzeit auslesen und habe meien Übersicht.

Zu 3: Mag sein, dass es das schon gibt. Aber erstens möchte ich noch ein bisschen lernen und 2. muss ich mich irgndwie in Corona Zeiten beschäftigen.
Die EInfachen Zahl-Statistiken komen unten drunter oder uU auch drüber, so dass ich sehen kann:
Monat Feb 20:
Meier: 8 h im Büro
12 h Fahrzeit
10h Pause
154 h Kunde
3 h Urlaub
usw
beispiel
Member: MadMax
Solution MadMax Apr 14, 2020 at 18:44:20 (UTC)
Goto Top
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:
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
Member: tsunami
tsunami May 07, 2020 at 06:11:25 (UTC)
Goto Top
Hi,
konnte es nun lösen.
Order by datum und datum like "2019-02%"...
Dann einfach untereinander und passt. Einzige Ausnahme, die ich noch umsetzen möchte:
Notdienst-Einsatz. Also Feierabend um 17:00 und um 21 Uhr muss einer raus wegen Rohrbruch.
Dan muss ich die Differenz zwischen letzter Zeit und neuer Zeit nehmen. Die ist bei noramlen Tagen immer 0.
08:00 - 08:15 Anfahrt
08:15 - 09:00 Kunde 08:15 - 08:15 = 0
09:00-09:15 Pause usw 09:99-09:00 = 0
21:00 - 21:15 Anfahrt -> 21:00 - 17:00