# MySQL Zeit berechnen



## BaseBallBatBoy (30. Juni 2011)

Hi

Ich will berechnen wie lange ein Auftrag bereits bei mir war. Dazu erklaerich ich kurz den Workflow:

"Auftragseingang"
dann optional "Informationen nachfragen" und anschliessend "Informatioen erhalten" (diese beiden koennen beliebig oft vorkommen, nachfragen wird aber immer mit erhalten abgeschlossen. 
dann "Auftragsausgang"

dann besteht optional auch die moeglichkeit, dass ein neuer Auftrag mit der selben Nummer wieder reinkommt, weil der Kunde mit unserer Auftagsabwicklung nicht zufrieden war (sprich das ganze wieder von vorne).

Wie kann ich nun mit SQL automatisch die Zeit berechnen? View, Stored procedure, etc.? Und wie loese ich das ganze?

Ein kleines Beispiel:

Tabelle Auftragszeiten

id, auftragsid, aktion, datum_zeit
30, 55, Auftragseingang, 2011-06-28 10:00
31, 55, Informationen nachfragen, 2011-06-28 11:00
32, 55, Informatioen erhalten, 2011-06-28 12:00
33, 55, Informationen nachfragen, 2011-06-28 13:00
34, 55, Informatioen erhalten, 2011-06-28 14:00
35, 55, Auftragsausgang, 2011-06-28 15:00
36, 55, Auftragseingang, 2011-06-28 16:00
37, 55, Auftragsausgang, 2011-06-28 17:00

Also mit diesen Werten moechte ich am Schluss wissen, dass ich mit dem Auftrag 55 total 4 Stunden verbracht habe. (Zeiten zwischen nachfragen und erhalten sowie ausgang und eingang zaehlen nicht. Und achtung, es kann auch sein, dass z.B. id 37 noch nicht da ist, dann ist der Auftag also immer noch bei mir). Ist sowas moeglich?

Gruss


----------



## soa (3. Juli 2011)

Moin, 

die Differenz zweier Datümer könntest Du mit der  to_days() ermitteln:


```
select now() as 'aktuelles Datum',date_sub(now(),interval 365 day)
 as 'Datum vor 365 Tagen',
 to_days(now())-to_days(date_sub(now(),interval 365 day)) as
 'Differenz';
```

Das Start - bzw. Enddatum kannst Du sehr leicht ermitteln:


```
select min(datum_zeit) from Auftragszeiten where auftragsid = 55;
select min(datum_zeit) from Auftragszeiten where auftragsid = 55;
```

Das Zusammenführen überlasse ich Dir. Ich hoffe, der Beitag hat Dir geholfen.


----------



## raiguen (6. Juli 2011)

@soa:
Der TE möchte NICHT die Differenz zwischen zwei Datumswerten , also zwischen 2 Tagen, sondern eher die Zeitdifferenz in Stunden 
Insofern passt die Funktion TO_DAYS() nicht besonders gut; hier wäre eher TIMEDIFF() angesagt.
(Mehrzahl von Datum ist übrigens Daten  )


So, zum eigentlichen Problem und dem dargestellten Tabelleninhalt könnte man die Zeitdifferenz = Anzahl der Stunden pro Auftrag so mittels SQL lösen:


```
SELECT 
		TIMEDIFF(
					TIMEDIFF(t.aaz1, t.aez1) + TIMEDIFF(t.aaz2, t.aez2),
					TIMEDIFF(t.inz1, t.iez1)
					) AS AuftragsZeit 

		FROM
			( 
			SELECT	
				/* erste Auftragsbearbeitung */
				 MIN(CASE WHEN aktion='Auftragsausgang' THEN datum_zeit ELSE NULL END) as aaz1
				, MIN(CASE WHEN aktion='Auftragseingang' THEN datum_zeit ELSE NULL END) as aez1

				/*zweite Auftragsbearbeitung=Nacharbeit */
				, MAX(CASE WHEN aktion='Auftragsausgang' THEN datum_zeit ELSE NULL END) as aaz2
				, MAX(CASE WHEN aktion='Auftragseingang' THEN datum_zeit ELSE NULL END) as aez2

				/*Informationsbeschaffung etc*/
				, MAX(CASE WHEN aktion='Informatioen erhalten'  THEN datum_zeit ELSE NULL END) as iez1
				, MIN(CASE WHEN aktion='Informationen nachfragen' THEN datum_zeit ELSE NULL END) as inz1
				
				FROM auftragszeiten
				GROUP BY auftragsid
			) AS t
```

Vereinfacht gesagt, bewirkt oa. Abfrage im inneren SELECT zunächst die Ermittlung der entsprechenden Zeiten (Auftragseingang, -ausgang für den ersten Auftrag, das gleiche nochmal für den zweiten Auftrag=Nacharbeitung sowie die Zeiten der Informatuionsbeschaffung). Diese Zeitwerte werden in eine 'Zwischentabelle' t gesammelt, so dass diese dann im äusseren SELECT mittels TIMEDIFF() berechnet ausgegeben werden.

Sollen ALLE Auftrags-ID's berücksichtigt werden, dann nehme man

```
FROM auftragszeiten
				GROUP BY auftragsid
```
,

für nur eine bestimmte Auftrags-ID:

```
FROM auftragszeiten
				WHERE auftragsid=55
```


----------

