Seite 1 von 1

Zeiterfassung - Uhrzeiten addieren und subtrahieren

Verfasst: Di 18. Okt 2016, 12:36
von Moerser01
Hallo ,
ich bin Datenbankneuling und will wieder alles auf einmal. Nach tagelangen suchen im Netz muß ich doch die hilfe vom Forum in Anspruch nehmen:

Zeiterfassung:
Ich habe eine Tabelle erstellt mit

Datum - Von - Bis - PauseVon - PauseBis - DienstArt - ma_ID
1 17.10.16 8:00 16:50 9:50 10:00 D 1

Jetzt habe ich eine Abfrage erstellt in dem ich die Arbeitzeit ausrechnen kann ,also Bis minus Von in ArbeitGesamt

Code: Alles auswählen

SELECT CONCAT( CONCAT( DATEDIFF( 'hour', "Von", "Bis" ), ':' ), ( DATEDIFF( 'minute', "Von", "Bis" ) - ( DATEDIFF( 'hour', "Von", "Bis" ) * 60 ) ) ) AS "ArbeitGesamt", "Datum", "Von", "Bis", "PauseVon", "PauseBis", "DienstArt", "ma_ID" FROM "Gesamtdaten"


soweit ganz gut.
Das gleich habe ich mit PauseVon und PauseBis gemacht.
Glappt auch ganz gut aber jetzt wird schwierig.
Ich wollte gern beide Abfragen in eine vereinigen, also
Summe = (Bis-Von) - (PausBis-PauseVon)

und als Steigerung

Summe = (Bis-Von) - (PausBis-PauseVon) -50 min

Also das ich alles in einer Abfrage habe . Ist der Ansatz zu einfach gedacht( muß ich mit Tabellenbziehung arbeiten) oder ist das machbar?

Über Anregungen währe ich sehr dankbar?

thx Moerser01

Re: Zeiterfassung - Uhrzeiten addieren und subtrahieren

Verfasst: Di 18. Okt 2016, 17:30
von RobertG
Hallo Moerser01,

nicht tagelang im Netz suchen, sondern einfach das Handbuch runter laden: http://de.libreoffice.org/get-help/documentation/. Hier etwas nach unten scrollen. Da findest Du zum einen das ganze Handbuch für Base und auch die einzelnen Kapitel. Was Du brauchen kannst steht im Kapitel "Abfragen" ganz zum Schluss: "Rechenfehler in Abfragen".

Deine Abfrage ist da leider nicht ganz zielführend: Mit Hilfe von CONCAT machst Du aus Zahlen einen zusammengesetzten String, der dem Anschein nach ganz gut aussieht, aber weder zum weiteren Berechnen taugt noch Deine eigenen Kriterien erfüllt. Ich habe bereits bei einem Arbeitsbeginn von 7:50 Uhr und einem Ende von 18:10 Uhr ein Ergebnis von 11:-40 für "ArbeitGesamt".

Einfacher ist es, die Differenz gleich in Minuten angeben dann in Teile eine Tages umwandeln und das Ganze formatiert als Zeit anzeigen zu lassen. Das sieht dann so aus:

Code: Alles auswählen

SELECT "ID", DATEDIFF( 'minute', "Von", "Bis" )/1440.00000 AS "ArbeitGesamt", "Datum", "Von", "Bis", "PauseVon", "PauseBis" FROM "Gesamtdaten"
Wenn Du jetzt noch Deine Berechnungen unterbringen willst, erhältst Du diesen Code:

Code: Alles auswählen

SELECT "ID", DATEDIFF( 'minute', "Von", "Bis" )/1440.00000 AS "ArbeitGesamt", DATEDIFF( 'minute', "PauseVon", "PauseBis" )/1440.00000 AS "Pause", DATEDIFF( 'minute', "Von", "Bis" )/1440.00000 - DATEDIFF( 'minute', "PauseVon", "PauseBis" )/1440.00000 AS "Arbeit-Pause", DATEDIFF( 'minute', "Von", "Bis" )/1440.00000 - DATEDIFF( 'minute', "PauseVon", "PauseBis" )/1440.00000 - 50/1440.00000 AS "Arbeit-Pause-50", "Datum", "Von", "Bis", "PauseVon", "PauseBis" FROM "Gesamtdaten"
Da Base für Abfragen die Formatierung nicht speichert erhältst Du allerdings die saubere Ansicht nur, wenn Du ein Formular erstellst und in diesem die Felder für die Zeit entsprechend formatierst.

Bedenke, dass Zeitberechnungen in diesem Fall immer etwas mit Rundungen zu tun haben können. Deswegen habe ich hier in der Berechnung auch eine Zahl mit 5 Nachkommastellen erzeugt, um die entsprechende Genauigkeit herzustellen.

Gruß

Robert

Re: Zeiterfassung - Uhrzeiten addieren und subtrahieren

Verfasst: Di 18. Okt 2016, 17:59
von Moerser01
Dankeschön für die schnelle Antwort. Ich probiere es heute Abend gleich mal aus. Ich glaub ich verstehe den Aufbau des Codes auch soweit. Aber kannst du mir noch erklären was es mit der 1440 auf sich hat? Die Nullen nach der Kommmastelle, nehme ich an, ist wie viele Stellen nach dem Komma angezeigt werden und mit ihnen gerechnet wird?
Wenn ich so was öfter machen will muss ich wohl programmieren lernen oder gibs Internetseiten wo man verständlich solche Sachen erklärt bekommt?
Habe Tage lang gesucht und keine passende Antwort gefunden.
Danke

Re: Zeiterfassung - Uhrzeiten addieren und subtrahieren

Verfasst: Di 18. Okt 2016, 18:23
von RobertG
Hallo Moerser01,

Ursprung für die 1440: Die Formatierungsfunktion für Zeiten bei LO geht von Tagen als 1 Ganzes aus.
1 Tag hat 24 Stunden. 1 Stunde also 1/24 Tag.
1 Stunde hat 60 Minuten. 1 Minute also 1/60 Stunde oder 1/(24*60) Tag.
... und 24*60 sind eben diese 1440, also 1440 Minuten passen in einen Tag.

Wenn Du bei Abfragen mit Datenbanken eine Ganzzahl durch eine andere Ganzzahl teilst, so wird das Ergebnis wieder eine Ganzzahl sein. Trage einfach einmal für ein Feld in einer Abfrage 2/3 ein. Das Ergebnis ist 0. 3 passt nicht ganz in 2 rein, also eben überhaupt nicht. Das ist wie das Rechnen auf niedrigem Grundschulniveau: Da schreibt diese dusselige Programm nicht einmal irgendwo einen Rest auf. Auch wenn Du Dir noch so viele Nachkommastellen anzeigen lässt - es bleibt 0. Wenn Du jetzt 2/3.0 aufschreibst, dann teilst Du eine Ganzzahl durch eine Zahl mit einer Nachkommastelle. Das Ergebnis wird jetzt mit einer Nachkommastelle ausgegeben. 2/3.0 wird als 0,7 ausgegeben. Je weiter Du das Ganze mit Nachkommastellen versiehst, desto genauer wird die berechnete Zahl. Deswegen hier also .../1440.00000 - allein um der Genauigkeit willen. Für so etwas gibt es natürlich auch Funktionen, statt eben einfach Nullen als Nachkommastellen anzuhängen, CONVERT z.B. Aber das ist umständlicher.

Ich würde an Deiner Stelle einfach das Handbuch runter laden und dort über den PDF-Viewer drin suchen. Die Zuordnung von Inhalten zu Kapiteln habe ich da manchmal nicht so eindeutig regeln können. Das Programmieren brauchst Du dazu nicht zu lernen. Davon habe ich auch nur sehr wenig Ahnung.

Gruß

Robert

Re: Zeiterfassung - Uhrzeiten addieren und subtrahieren

Verfasst: Di 18. Okt 2016, 19:41
von Moerser01
Danke für die ausführliche Antwort. Jetzt verstehe ich den Aufbau auch. Habe mir das Handbuch runtergeladen. Ich hoffe das ich jetzt einige Probleme auch selber lösen kann.

MfG Moerser01