Seite 1 von 1

Stundenzahl aus Datum herausfinden

Verfasst: Mittwoch 3. Januar 2018, 16:05
von Vikardya
Hallo :)

Ich habe ein Programm geschrieben, mit dem erfasst wird, wann ein RFID-Tag (bzw. Gerät mit Tag) ausgeliehen wird. In einer Datenbank wird dann gespeichert, unter welchem Benutzeraccount welcher RFID-Tag ausgeliehen wird. Dazu wird auch das aktuelle Datum & Zeit festgehalten (Mit datetime.now()).
Nun möchte ich herausfinden, wieviele RFID-Tags zwischen 0 und 4 Uhr ausgeliehen wurden. Meine Überlegung dazu war, dass ich erst einmal alle Einträge aus der Datenbank zähle und dann nur die herausfiltere, wo die Stundenzahl >= 0 und <4 ist. (Anschließend will ich noch wissen wie viele von 4-8h, von 8-12h, ...)
Das hat mit anderen Beispielen auch super funktioniert.
Mein Problem ist nun, dass ich die Stundenzahl nicht aus den einzelnen Daten bekomme, bzw. mir da komplett der Ansatz fehlt.
Meine Programmierung sieht momentan wie folgt aus:

data1 = ([], [])
tageszeit1 = 0
tageszeit2 = 4

for x in range(1):
vals1 = db_session.query(func.count(Ausleihen.Entliehen_am)) \
.filter(Ausleihen.Entliehen_am >= tageszeit1) \
.filter(Ausleihen.Entliehen_am < tageszeit2)
data1[x].append(int(vals1[0][0]))

Jetzt muss ich an den blau markierten Stellen ja noch sagen, dass ich da jeweils nur die Stunde haben will und nicht das ganze Datum, aber wie?
Bei datetime.now() geht das ja einfach, indem man ein ".hour" dahintersetzt, da wird mir hier aber (logischerweise) nur angezeigt, dass das nicht funktioniert.
Vielen Dank schon einmal im Voraus!

Re: Stundenzahl aus Datum herausfinden

Verfasst: Mittwoch 3. Januar 2018, 16:14
von __deets__
Bitte benutz code-tags, um deinen Code zu formatieren. Und es sieht so aus, als ob du ein ORM tool benutzt, welches das ist zu erwaehnen kann auch nicht schaden.

Was dein eigentliches Problem angeht: ich nehme mal an, dass du da mit einer Funktion deiner DB arbeiten musst (so wie du ja auch schon func.count benutzt), die in dem Fall aber das aequivalent zu .hour auf datetime ist. In postgres findet man die zB hier:

https://www.postgresql.org/docs/9.1/sta ... etime.html

Wie sich das dann genau durch dein ORM darstellen laesst - musst du gucken.

Re: Stundenzahl aus Datum herausfinden

Verfasst: Mittwoch 3. Januar 2018, 16:36
von Vikardya
Entschuldige, hatte ich total vergessen. Ich benutze SQLalchemy.
Und bin anscheinend trotzdem zu doof, den richtigen Befehl zu finden.

Re: Stundenzahl aus Datum herausfinden

Verfasst: Mittwoch 3. Januar 2018, 16:43
von __deets__
Na dazu muss man noch deine DB kennen. Weiss auch keiner ;) Und ich kann dir nur raten, die SQLAlchemy Mailingliste zu abonnieren. Michael macht einen unglaublichen Job als Maintainer (oder hat zumindest als ich da noch aktiv war)

Re: Stundenzahl aus Datum herausfinden

Verfasst: Mittwoch 3. Januar 2018, 16:46
von Vikardya
Meine DB ist MySQL...
WIe man merkt, bin ich auf dem Gebiet wirklich eine Niete :roll:

Re: Stundenzahl aus Datum herausfinden

Verfasst: Mittwoch 3. Januar 2018, 17:24
von Sirius3
@Vikardya: eine Googlesuche liefert gleich als erstes Ergebnis eine Stackoverflow-Frage: Group by hour in sqlalchemy. Dann würde ich alle Stunden gemeinsam abfragen und die viererpäckchen in Python bilden, oder gleich noch den Rest als SQL programmieren.

Code: Alles auswählen

count_per_hour = db_session.query(func.extract('hour', Ausleihen.Entliehen_am).label('hour'), func.count()).group_by('hour')

Re: Stundenzahl aus Datum herausfinden

Verfasst: Mittwoch 3. Januar 2018, 18:02
von Vikardya
@Sirius3: Vielen Dank, dieser "extract"-Befehl hat mir nur gefehlt :roll:
Jetzt funktioniert endlich alles :)

Re: Stundenzahl aus Datum herausfinden

Verfasst: Mittwoch 3. Januar 2018, 18:06
von Sirius3
@Vikardya: Dir hat auch noch gefehlt, dass man mit group_by alles auf einmal abfragen kann. Man läßt am besten so viel wie sinnvoll durch die Datenbank auswerten.

Re: Stundenzahl aus Datum herausfinden

Verfasst: Donnerstag 4. Januar 2018, 11:51
von Vikardya
Vielen Dank nochmal!
Ich wollte das gleiche jetzt nochmal statt mit Stunden mit Wochentagen machen, dafür habe ich dann statt 'hour' 'isodow' benutzt. Nur da sagt mir mein Programm, dass da ein ProgrammingError vorliegt... mit dem Befehl 'dow' habe ich es ebenfalls ausprobiert.
Liegt es daran, dass ich einen falschen Befehl benutze? Oder ist irgendeins meiner Programme veraltet? :roll:

Re: Stundenzahl aus Datum herausfinden

Verfasst: Donnerstag 4. Januar 2018, 12:08
von __deets__
Bitte *konkrete* Fehlermeldungen, und wenn moeglich Versionen der eingesetzten Pakete und Anwendungen.

Re: Stundenzahl aus Datum herausfinden

Verfasst: Donnerstag 4. Januar 2018, 12:21
von Vikardya
Die konkrete Fehlermeldung:

ProgrammingError: (_mysql_exceptions.ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'isodow FROM ausleihen.`Entliehen_am`) = 1 \n LIMIT 1' at line 3") [SQL: u'SELECT count(ausleihen.`Nutzer`) AS count_1 \nFROM ausleihen \nWHERE EXTRACT(isodow FROM ausleihen.`Entliehen_am`) = %s \n LIMIT %s'] [parameters: (1, 1)]

Re: Stundenzahl aus Datum herausfinden

Verfasst: Donnerstag 4. Januar 2018, 12:46
von __deets__
Guckst du Dokumentation zu EXTRACT bzw. den Feldern, die es erlaubt:

https://dev.mysql.com/doc/refman/5.5/en ... n_date-add

day ist also dein Freund. Oder statt EXTRACT mit einem Feld gleich DAYOFWEEK.

Re: Stundenzahl aus Datum herausfinden

Verfasst: Donnerstag 4. Januar 2018, 12:52
von __deets__
Ich muss mich korrigieren: DAY hilft dir natuerlich nicht. Also DAYOFWEEK ist es, aber OHNE EXTRACT!

Re: Stundenzahl aus Datum herausfinden

Verfasst: Donnerstag 4. Januar 2018, 13:09
von Vikardya
Danke! Hat (mal wieder) super funktioniert :)