MySQL Abfrage / Suchen von gleichen Inhalten in zwei Feldern (Spalten) in mehreren Zeilen

Hallo,

ich bin am verzweifeln. Habe so einiges versucht, komme jedoch nicht weiter.

Aufgabenstellung:
In einer Tabellen stehen Arbeitszeiten von Mitarbeitern. Ich möchte wissen, wer nach 6 Stunden Arbeitszeit keine Pause gemacht hat.
Der Mitarbeiter kann einen Eintrag am Tag haben, zwei, drei, sogar 10 Einträge haben.

Tabelle:
ID, Mitarbeiter, Tag, Monat, Jahr, Zeit von, Zeit bis, Stunden
2, Fritz,1,10,2014, 08:00, 10:00, 2
11, Fritz,1,10,2014, 13:00, 19:00, 2
8, Fritz,1,10,2014, 07:30, 08:00, 0,5
16, Fritz,1,10,2014, 11:30, 12:00, 0.5
4, Fritz,1,10,2014, 12:00, 16:00, 4
6, Fritz,1,10,2014, 16:00, 19:00, 3…

Ich denke mir, die Anfangszeit zu sortieren asc und müsste dann in der nächsten zeile nachschauen, ob der anfangswert der zeile dem endwert der vorherigen zeile entspricht.
und das für alle relevanten zeilen. wenn die anfangswerte immer mit den endwerte übereinstimmen hat er durch gearbeitet und keine pause genommen und der datensatz soll ausgegeben werden. wenn mindestens eine pause von 30 minuten zu finden ist soll er weitersuchen und prüfen, ob er nach 12 stunden entweder mindestens 1 stunde pause genommen hat oder jeweils eine halbe stunde alle 6 stunden.

Ich habe diverse Foren nach meinem Problem gesucht, jedoch keine Hilfe für zwei verschiedene Felder in zwei oder mehr Zeilen gefunden. Möglichweise kann man das auch über eine Schleife realiseren. Ich bin nicht wirklich fit in SQL und PHP und würde mich über ein paar Tipps freuen.

Danke,… Jürgen

pro tag
max(endtime) - min (starttime) = Arbeitszeit pro tag
sum (endtime - starttime) = real gearbeitet

if ( real gearbeitet > 8 stunden)
if (Arbeitszeit pro tag - real gearbeitet >= 0,5 )
Hat Pause gemacht
ifnot
Hat keine Pause gemacht
ifnot
keine pause nötig

so wenigstens als Ansatz , könnte es helfen .

Ich hab doch nochmal gelesen was du da willst, und
das du ja mixed mit php

Das was ich als if geschrieben habe könnte man auch als WHEN nutzen .

SELECT
(SUM) as ARBEIT ,
(MAX-MIN) as TAG ,
(MAX-MIN) - SUM as PAUSEN
WHEN
TAG >= 6
AND
TAG = 0,5

das waren alle die Pause gemacht haben bei 6-12 stunden arbeit

SELECT
(SUM) as ARBEIT ,
(MAX-MIN) as TAG ,
(MAX-MIN) - SUM as PAUSEN
WHEN
TAG >= 12
AND
PAUSEN >= 1

das waren alle die Pause gemacht haben bei 12 oder mehr stunden arbeit

so mal lesbar gemacht :smile:

man muss also nicht zwingend if oder so benutzen …

1 Like

Hallo TechPech,

ich komme leider erst heute zum Lesen und möchte mir erst einmal für Deine Bemühungen bedanken.

Ich habe im Grunde verstanden wie Du die Abfrage meinst, jedoch verstehe ich nicht genau, wie und wann das script durch meherer Zeilen läuft um die erste Anfangszeit und die letzte Arbeitszeit ermittelt.

Meine Abfrage würde so aussehen (sicherlich noch extrem fehlerhaft):

$query101 = "SELECT
(SUM) as ARBEIT ,
(MAX-MIN) as TAG ,
(MAX-MIN) - SUM as PAUSEN
FROM Arbeitszeit
WHEN
TAG >= 6
AND
TAG = 0,5
where MA_Nummer = " . $row100[„ID“] . " and Jahr = " . $Jahr . " and Monat = " . $Monat . " and Tag = " . $Tag . „“;

Offenbar hänge ich am zusammensetzen der Abfrage. Ich muss ja einige Datensätze durchsuchen. Vielleicht kannst Du mir noch eine Hilfestellung geben.

Danke, … Jürgen

Also ein bischen mitdenken musst du schon .

MIN und MAX und SUM sind funktionen . siehe mysql

diese brauchen natürlich Felder von denen sie das Minimum und das Maximum und die Summe bilden können.

wenn also das feld anfangzeit und endzeit gibt

SELECT MIN(anfangszeit) , MAX(endzeit) FROM tabelle

dann ist MIN die niedrigst gefundene Zeit des Tages
dann ist MAX die höchste Zeit des Tages

SELECT SUM(endzeit-anfangszeit) FROM tabelle

SUM = jeder dgefundene datensatz wird endzeit-anfangszeit und dann addiert , also die summe der netto arbeitszeit pro tag

somit ergibt sich

SELECT 
 MIN(anfangszeit) , 
 MAX(endzeit) , 
 SUM(endzeit-anfangszeit) 
FROM tabelle

damit sich das besser lesen lääst

SELECT 
 (MAX(endzeit) - MIN(anfangszeit) ) as Brutto , 
 SUM(endzeit-anfangszeit) as Netto 
FROM tabelle

das ganze sollte natürlich Gruppiert werde auf den jeweiligen Benutzer (da wir ja von dem jeweiligen nutzer die daten suchen) , es wird also gruppiert und dann ausgewertet pro gruppe .

SELECT 
 (MAX(endzeit) - MIN(anfangszeit) ) as Brutto , 
 SUM(endzeit-anfangszeit) as Netto 
FROM tabelle
WHERE datum = '12.12.2012' 
GROUP BY arbeiter

das ganze könnte man auch noch um paar felder erweitern

SELECT 
 ( MAX(endzeit) - MIN(anfangszeit) ) as Brutto , 
 SUM(endzeit-anfangszeit) as Netto,
 ( ( MAX(endzeit) - MIN(anfangszeit) - SUM(endzeit-anfangszeit) ) ) as PAUSE
FROM tabelle
WHERE Datum = '12.12.2012' 
 AND ( MAX(endzeit) - MIN(anfangszeit) ) \>= 6 
 AND ( MAX(endzeit) - MIN(anfangszeit) ) 



und ich würde es so machen



    SELECT 
     ( MAX(endzeit) - MIN(anfangszeit) ) as Brutto , 
     SUM(endzeit-anfangszeit) as Netto,
     ( ( MAX(endzeit) - MIN(anfangszeit) - SUM(endzeit-anfangszeit) ) ) as PAUSE,
     ( ( MAX(endzeit) - MIN(anfangszeit) ) \>= 6 
     AND ( MAX(endzeit) - MIN(anfangszeit) ) = 12 as PAUSE12plus,
    
     ( ( MAX(endzeit) - MIN(anfangszeit) ) \>= 6 
     AND ( MAX(endzeit) - MIN(anfangszeit) ) = 0.5
     ) as PauseGemachtBei6bis12,
    
     ( ( MAX(endzeit) - MIN(anfangszeit) ) \>= 12 
     AND ( MAX(endzeit) - MIN(anfangszeit) - SUM(endzeit-anfangszeit) ) \>= 1.0
     ) as PauseGemachtBei12plus
    
    FROM tabelle
    WHERE datum = '12.12.2012' 
    GROUP BY datum , arbeiter





dann hab ich

Brutto,Netto, PAUSE, PAUSE6bis12 , PAUSE12plus, PauseGemachtBei6bis12, PauseGemachtBei12plus

Warum, na so kann ich den satz zum view schicken und dort einfach nach boolean die Ausgabe anpassen . .. mehr auf [http://w-w-w.ms/a5esuc](http://w-w-w.ms/a5esuc)

Hallo

where MA_Nummer = " . $row100[„ID“] . " and Jahr = " . $Jahr .
" and Monat = " . $Monat . " and Tag = " . $Tag . „“;

dat unsinn ,
entweder ein join mit der tabelle
oder ein group auf die MA_Nummer , somit kriegst du für jede MA_Nummer
die entsprechende rechnung in min max sum etc

ein where sollte nur die datumsgruppe wählen für den tag ,
dann hat man alle datensätze des tages
danach gruppiert man nach mitarbeiter
dann hat man für diesen tag pro mitarbeiter die daten