2017-11-04 1 views
0

hinzufügen oder subtrahieren Ich versuche, eine Abfrage, die alle gearbeiteten Stunden, Tage und Personen zeigen wird. Ich habe das runnnning.Wie Minuten von einem timediff Ergebnis in mysql

asume ich habe eine Tabelle namens uren:

rec_id | user_id | start (datetime) | eind (datetime) 

und ich habe Tabelle

user_id | name  | 

Mit der Abfrage Benutzer

genannt unten i fast alle Informationen habe ich möchte.

select users.name, sec_to_time(SUM(TIME_TO_SEC(TIMEDIFF(uren.eind, uren.start)))),count(distinct(date(start))) as dagen 
from uren, users 
where date(uren.start) between CAST('2017-10-04 00:00:00' as Date) and CAST('2017-11-04 00:00:00' as DATE) and 
     uren.user_id = users.user_id 
group by uren.user_id 
ORDER BY name 

Was mich zeigt diese

Piet (name) 230 (hours total) 24(days worked) 

Jetzt kommt die eigentliche Frage:

I 30 Minuten pro Tag weniger als 5 Stunden gearbeitet abziehen wollen.

Im ahnungslosen atm. Kann someonme helfen bitte

Antwort

0

eine Zeile pro Benutzer pro Tag Unter der Annahme:

select users.name, 
     (sec_to_time(sum(time_to_sec(timediff(uren.eind, uren.start))) - 
        30 * 60 * sum(time_to_sec(timediff(uren.eind, uren.start)) < 5*60*60) 
        ) 
     ), 
     count(distinct(date(start))) as dagen 
from uren join users 
    on uren.user_id = users.user_id 
where date(uren.start) between '2017-10-04' and '2017-11-04' 
group by uren.user_id 
order by name; 

Wenn eines Tages mehrere Schichten hat, können Sie von Tag aggregieren müssen zuerst:

select u.name, 
     (sec_to_time(sum(day_secs) - 
        30 * 60 * sum(day_secs < 5*60*60) 
        ) 
     ), 
     count(*) as dagen 
from (select uren.user_id, uren.name, date(uren.start), 
      sum(time_to_sec(timediff(uren.eind, uren.start))) as day_secs 
     from uren join 
      users 
      on uren.user_id = users.user_id 
     where uren.start >= '2017-10-04' and uren.start < '2017-11-05' 
     group by uren.user_id, date(uren.start) 
    ) u 
group by name 
order by name 
+0

1 Datum können mehrere Schichten enthalten, aber schlecht ein gehen mit dem, was Sie mir gezeigt, über vielen Dank! Ich werde Sie wissen lassen, ob es funktioniert – Malawi

+0

Versuchte Ihre Lösungen wieder und es funktionierte großartig :) Vielen Dank – Malawi

0

Es ist eine gute Grund, dass du keine Ahnung hast. Es ist, weil das, was Sie fragen, ziemlich komplex ist.

Das erste, was Sie akzeptieren müssen (und ich meine verzweifelt akzeptieren) ist, dass Ihre Funktion Tage und Benutzer abhängt, und daher brauchen Sie Gruppe von beiden zuerst, dann nur von Benutzern im Endergebnis. Dazu benötigen Sie eine Unterabfrage, die nach Tagen und Benutzern gruppiert ist, bevor das übergeordnete Element von Benutzern gruppiert werden kann.

Hier ist, was ich kam mit ...

SELECT 
users.name, 
sec_to_time(SUM(ur.timeWorked)) as tWorked, 
SUM(ur.dagen) as Dagen 

FROM users 
INNER JOIN ( 

    SELECT 
    user_id, 

    SUM(TIME_TO_SEC(TIMEDIFF(`eind`, `start`))) - (1800 * 
    IF(SUM(TIME_TO_SEC(TIMEDIFF(`eind`, `start`))) < 18000,1,0)) 
    as `timeWorked`, 

    count(distinct(date(`start`))) as `dagen` 

    FROM uren 

    WHERE date(`start`) 
    BETWEEN CAST('2017-10-04 00:00:00' as Date) 
    AND CAST('2017-11-04 00:00:00' as DATE) 
     GROUP BY user_id, DAYOFYEAR(`start`) 

    ) as ur ON ur.user_id = users.user_id 

GROUP BY ur.user_id 
ORDER BY name 
+0

(übrigens änderte ich die 30 Minuten in 900 Sekunden, als ich in meiner ersten Annahme falsch war) Auf den ersten Blick schien es perfekt zu funktionieren , stieß aber auf etwas Seltsames. Ein Arbeiter hatte 3 Schichten über 3 Tage und alle Schichten waren weniger als 5 Stunden, die Gesamtarbeitszeit betrug 7 Stunden und 8 Minuten. es sollte 3x 15 Minuten entfernt haben, also wäre das Ergebnis 6:23, aber ich bekomme 6:38. – Malawi

+0

BTW was macht (SELECT @underFive: = 0) wie uf im letzten Teil tun? Was ist das? – Malawi

+0

Die Verwendung einer Variablen hat einige Probleme. Sie haben in Ihrem letzten Kommentar darauf hingewiesen. In der ersten Zeile der Abfrage muss die a-Variable bereits gesetzt sein und dies geschieht im FROM-Teil der Abfrage. Dies wird zu komplex, wenn die Variable eine IF-Bedingung hat. Ich habe alles zusammen gemacht. Diese überarbeitete Antwort sollte funktionieren. –

Verwandte Themen