Seite 1 von 1
Zeiten subtrahieren
Verfasst: Freitag 6. Februar 2015, 19:34
von erdmulch
Hallo zusammen,
ich habe folgenden Code:
Code: Alles auswählen
stoptime = Time.objects.all().order_by('endtime')
for coloumn in stoptime:
stoptime = Time.objects.get(endtime=coloumn.endtime)
stoptime.endtime = datetime.now()
stoptime.save()
starttime = Time.objects.all().order_by('starttime')
for coloumn in starttime:
starttime = Time.objects.get(endtime=coloumn.endtime)
print datetime.date(starttime) - datetime.date(stoptime)
Leider kommt folgende Fehlermeldung:
descriptor 'date' requires a 'datetime.datetime' object but received a 'Time'
Kann mir jemand sagen wie man die 2 Zeiten richtig voneinander subtrahiert.
vielen Dank
Re: Zeiten subtrahieren
Verfasst: Freitag 6. Februar 2015, 19:38
von EyDu
Übersetze dir mal die Fehlermeldung, die ist wirklich sehr eindeutig.
Re: Zeiten subtrahieren
Verfasst: Freitag 6. Februar 2015, 19:43
von erdmulch
das weiß ich, dass die Fehlermeldung sehr eindeutig ist.
Aber wie mache ich es richtig?
Re: Zeiten subtrahieren
Verfasst: Samstag 7. Februar 2015, 09:07
von erdmulch
niemand eine Idee?
Re: Zeiten subtrahieren
Verfasst: Samstag 7. Februar 2015, 11:27
von BlackJack
Ich habe mir den Code mal inhaltlich angeschaut:
Als erstes: Was bedeutet `coloumn`? Ich vermute mal das ist ein Tippfehler und sollte `column` heissen, das macht aber nicht wirklich Sinn. Das ist doch keine Spalte sondern ein `Time`-Exemplar. Warum heisst das dann nicht `time`? Und warum werden die Namen `stoptime` und `starttime` jeweils in der selben Schleife sowohl für *alle* `Time`-Objekte als auch für einzelne `Time`-Objekte verwendet? Das ist extrem verwirrend. Überhaupt ist eine Bezeichnung im Singular für eine *Sequenz* von Werten unpassend.
Dann habe ich ein Verständnisproblem bei der ersten Schleife. Es wird über *alle* `Time`-Objekte aus der Datenbank iteriert. Wozu werden die dann *in* der Schleife noch mal alle mit `get()` *noch mal* ermittelt? Und funktioniert das überhaupt? Denn bei `get()` muss es ja zu jeder Zeit *genau* *einen* passenden Treffer geben. Und das müsste dann ja das Objekt *selbst* sein. Und damit ergeben alle `get()`-Aufrufe zusammen wieder alle `Time`-Objekte — die hast Du doch aber schon von der Schleife einmal alle abgefragt. Die erste Schleife sollte damit (fast) das gleiche machen wie diese einfachere hier:
Code: Alles auswählen
now = datetime.now()
for time in Time.objects.all().order_by('endtime'):
stoptime.endtime = now
stoptime.save()
Bei der zweiten Schleife fragt man sich wieder warum das überhaupt eine Schleife ist, denn die durchläuft *alle* `Time`-Objekte aus der Datenbank nur im mit dem *letzten* dann tatsächlich etwas zu machen. Da würde man ja eher einfach nur das letzte Objekt von der Datenbank abfragen statt alle. `QuerySet.latest()` wäre da die passende Methode für.
Das (erste) Problem liegt daran das `datetime` an der Stelle wo es kracht nicht den Wert hat den Du da anscheinend vermutest. Lass Dir den Wert und Typ einfach mal ausgeben und vergleich das mit dem Wert und Typ den das haben müsste.
Und vielleicht auch mal die Werte und Typen von `starttime` und `stoptime`. Und dann überleg mal ob der Umweg den Du da versuchst überhaupt nötig ist.
Als letztes stellt sich noch die inhaltliche Frage *was* Du an der Stelle überhaupt berechnen möchtest. So wie es aussieht ist das die Zeitspanne zwischen der Startzeit des `Time`-Objektes mit der ältesten Startzeit und der Endzeit des `Time`-Objektes mit der ältesten Endzeit. Dir ist klar dass es sich dabei nicht zwangsläufig um das selbe `Time`-Objekt handeln muss und das ist so gewollt?