ich habe den folgenden Code geschrieben, welcher auch funktioniert.
Hier wird aus einer Datenbank, Zeiten ausgelesen und daraus sollen Pausen sowie die Summe der Arbeitszeit ermittelt werden bis eine Differenz von 6 Std zwischen der letzten Abmeldung und der nächsten Anmeldung sind. Das funktioniert auch, mein Problem ist aber das ich es nicht hinbekomme, wenn tagesübergreifend gearbeitet wird:
Da mein Code endet, wenn die Zeitdifferenz größer 6 Std. ist.
Normal müsste an dem Tag noch einmal geschaut werden ob es nach den 6 Std. wieder eine Anmeldung gibt, diese Zeit müsste dann separat summiert werden.
Kann mir jemand helfen?
Code: Alles auswählen
import datetime
import firebirdsql
import industriezeit
import round_timestamp
def calc_worktime(fromdate,todate,zeitraumid):
def calc_arbeitszeit_dezimal(arbeitszeit):
print('Arbeitszeit:', arbeitszeit)
#global dez_arbeitszeit
#global dez_pause
#global helfer
dez_arbeitszeit = industriezeit.zeit_to_dezimalzeit(arbeitszeit)
print('Pause:', pause)
dez_pause = industriezeit.zeit_to_dezimalzeit(pause)
print("############# DEZIMAL ##############")
cur.execute("Select Vornamename from stammdatenlohn where helferid = '%s'"%zeitraumid)
helfer = cur.fetchall()
print(helfer[0])
print("Pause-Dez:",dez_pause)
print("Arbeitszeit-Dez:",dez_arbeitszeit)
print("####################################")
return [dez_arbeitszeit,dez_pause,helfer[0]]
# Verbindung zur Firebird-Datenbank herstellen
con = firebirdsql.connect(
host='localhost', database='c:\\db\test).fdb',
user='xyz', password='123456'
)
# Cursor erstellen
cur = con.cursor()
# SQL-Abfrage ausführen
#cur.execute("SELECT * FROM zeitbuchungen where datum > '%s' and datum < '%s' and zeitraumid = '%s' ORDER BY datum, zeit" %(fromdate,todate,zeitraumid))
cur.execute("SELECT * FROM zeitbuchungen where datum between '%s' and '%s' and zeitraumid = '%s' ORDER BY datum, zeit" %(fromdate,todate,zeitraumid))
# Ergebnisse abrufen
results = cur.fetchall()
# Arbeitszeit und Pausen berechnen
arbeitszeit = datetime.timedelta()
pause = datetime.timedelta()
last_timestamp = None
last_date = None
last_pause_begin = None
abmeldung = None
abmeldung2 = None
pausenzahl = 0
nextday = False
## Schleife um die Stempelungen auszuwerten
for row in results:
#print(row)
timestamp = datetime.datetime.combine(row[2], row[3])
#print("gerundet", round_timestamp.round_zeit(str(timestamp)))
##Erste Anmeldung wird gesucht
if row[1] == 1:
##print(row[1], row[2], row[3], "Anmeldung")
# last_timestamp = timestamp
anmeldung = timestamp
last_date = row[2]
if abmeldung is not None and abmeldung is not 'ENDE':
##print("Abmeldung= ", abmeldung, " Anmeldung= ", anmeldung)
if (anmeldung - abmeldung).total_seconds() >= 6 * 60 * 60:
# Tag beenden
print("*************** Tag beenden")
letzte_Buchung = row
abmeldung = 'ENDE'
nextday = True
abbruchsrow = row
werte = calc_arbeitszeit_dezimal(arbeitszeit)
else:
if last_timestamp is not None:
print("Pausen", timestamp, "-", last_timestamp)
pause += timestamp - last_timestamp
print(pause)
else:
### Pausenzeit wird summiert
if row[1] == 0 and abmeldung is not 'ENDE':
# if last_timestamp is not None:
print(row[1], row[2], row[3], "Abmeldung")
abmeldung = datetime.datetime.combine(row[2], row[3])
arbeitszeit += abmeldung - anmeldung
last_timestamp = abmeldung
print("Abmeldung= ", abmeldung, " Anmeldung= ", anmeldung)
print("Return-Daten",werte[0],werte[1],werte[2])
#return dez_arbeitszeit,dez_pause,helfer[0]
return werte[0],werte[1],werte[2]
# Verbindung schließen
#cur.close()
con.close()
if __name__ == "__main__":
fromdate = '18.07.2023'
todate = '20.07.2023'
zeitraumid = 6433
calc_worktime(fromdate,todate,zeitraumid)