SQL-Query mit LIKE und einer Variablen

  • Hallo Wissende, ich brauche Eure Hilfe. Folgendes Problem:

    Ich zeichne mit einem Sensor die Temperatur auf und speichere die Werte

    in einer Datenbank. Funktioniert. Die Eintragung der Werte werden mit einem

    Timestamp versehen. (z.B. 2020-11-13 09:00:04)

    Nun möchte ich einmal am Tag (zum Beispiel 23.59 Uhr) den Tagesdurchschnittswert

    berechnen und diesen in einer weitere Tabelle speichern.

    Dazu habe ich in einen Miniscript die Variable "aktuellesDatum" erzeugt und möchte

    diese Variable in einem SQL-Query einsetzen. So wie hier:

    sql = "select avg(temp) from wetterdaten where zeit like '%aktuellesDatum%'"

    Ich habe mir gedacht, dass ich das "like" und die Platzhalter verwenden muss, da

    die Variable "aktuellesDatum" den Wert "2020-11-13" ausgibt und der Vergleichswert

    "zeit" in der Datenbanktabelle die Form "2020-11-13 09:00:04" hat.

    Habe schon verschiedene Varianten mit Klammern, einfachen Anführungszeichen usw.

    versucht. Leider gibt mir das Script immer nur "none" aus. Trage ich hinter dem

    "like" einen absoluten Wert ein erhalte ich einen Durchschnittswert.

    Frage: In welcher Form muss ich die Variable "aktuellesDatum" in den SQL-Query schreiben

  • Hallo,

    die allerallermeisten Python-Anbindungen folgen der DB-API 2.0 und darin ist auch definiert, welches Platzhalter für Variablen in WHERE-Clause gibt. Welche Form die DB-Anbindung der eigenen Wahl nutzt muss man in der Regel in der jeweiligen Doku nachlesen. In deinem Fall: https://dev.mysql.com/doc/connector-…sor-select.html.

    Außerdem dürfte der Query so sowie so nicht funktionieren, weil ein Datum nicht gleich einem Zeitstempel sein kann. Ungetestet: SELECT AVG(temp) FROM wetterdaten WHERE DATE(zeit) = DATUM. DATUM musst du natürlich durch ein Datum ersetzen, also z.B. '2020-11-14'.

    Du verwendest scheinbar noch Python 2, was seit 1.1.2020 ohne Unterstützung durch die Python-Entwickler ist. Du solltest also zeitnah auf Python 3 umstellen.

    Gruß, noisefloor

  • Ja, aber genau DAS ist ja mein Problem. Setze ich für DATUM z.B. 2020-11-14 ein, dann funktioniert das Script. Ich möchte aber vorher eine VARIABLE mit dem Inhalt des momentanen Datums erstellen und dann diese Variable statt des "2020-11-14" in den Query einsetzen. Eben so, dass das Script täglich per Cronejob aufgerufen wird und die Durchschnittstemperatur des aktuellen Datum ausgegeben wird. Mein Problem ist, dass ich nicht weiß, in welcher Form diese Variable in den Query geschrieben wird. (Anführungszeichen, Klammer....... usw.)

  • schalck Das ist egal, es kann sogar sein das die da gar nicht reingeschrieben wird sondern als separater Wert übertragen wird. In die Abfrage kommt ein Platzhalter. Da musst Du schauen welche Platzhalter das Modul verwendet welches Du verwendest. Der Wert wird mit dem zweiten Argument übergeben und zwar als `datetime.date` und nicht als Zeichenkette.

    Beispiele/die Dokumentation dazu hat noisefloor bereits verlinkt.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Ich würde das eh nicht machen. Daten die man in der Datenbank berechnen kannst, speichert man nicht nochmal. Mit groupby kannst du pro Tag gruppieren & dann den Durchschnitt bilden. Oder du nutzt gleich InfluxDB & konfigurierst die so ein Verhalten in der Weboberfläche.

  • Ich möchte aber vorher eine VARIABLE mit dem Inhalt des momentanen Datums erstellen und dann diese Variable statt des "2020-11-14" in den Query einsetzen.

    Genau das ist doch in dem 1. Beispiel in der Doku gezeigt, die ich dir verlinkt habe. Wenn du damit ein Verständnisproblem hast - ok, aber dann müsstest du noch sagen, was genau daran dein Problem ist.

    Gruß, noisefloor

  • Noch einmal ich.... ich kriegs nicht hin. Habe zwar einiges gelesen, aber wahrscheinlich zu wenig verstanden.

    Noch einmal kurz zu meinem Problem:

    Ich stelle folgende Anfrage an meine Datenbank:

    sql = "select avg(temp) from wetterdaten1 where datetime.date(datum) = '2020-11-16'"

    Das heißt, ich möchte den Durchschnitt der Temperaturen erhalten, welche am 2020-11-16 in meiner Tabelle gespeichert wurden.

    In der Tabelle existiert eine Spalte mit der Bezeichnung "datum" im Format DATE. Soweit gibt mir das Miniscript den Druchschnittswert aus.

    Nun möchte ich aber das Script an anderen Tag starten OHNE jeweils das aktuelle Datum in Form von 2020-11-16 usw. eintragen zu müssen.

    Ich möchte, dass dieser (aktuelle) Datums-Wert automatisch erzeugt wird. Alle Versuche, mit Hilfe des Moduls "datetime" das hinzubekommen, scheiterten.

    Kann mir jemand eine Programmzeile zusammenbasteln um mein "Monster-Vorhaben" zu realisieren ?

    (Ja, ich weiß, dass ich mich intensiv mit der Theorie von Python auseinandersetzen muss. Aber ich bin butiger Anfänger und brauche ein

    kleines Erfolgserlebnis)

    Ich danke Euch für Eure Hilfe.

  • Ja, ich weiß, dass ich mich intensiv mit der Theorie von Python auseinandersetzen muss.

    Alleine schon wegen den Beispielen in der offiziellen Python-Dokumentation lohnt es sich:

    Quote

    7.1.2. The String format() Method

    Basic usage of the str.format() method looks like this:

    >>>

    Code
    >>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
    We are the knights who say "Ni!"

    :lol:

    Sorry, ich kann dir aus dem Stehgreif leider nicht weiterhelfen, aber da ich das gerade gelesen habe, fand ich es passend ^^

    Ist das : https://mariadb.com/kb/en/aggregate-functions/ nichts?

    Grüße

    Dennis

    🎧 Strahlend soll die Zukunft sein, gut wir werden seh'n, ob wir wie ein Strahlemann lächelnd untergeh'n.  🎧

  • Hallo,

    Quote

    sql = "select avg(temp) from wetterdaten1 where datetime.date(datum) = '2020-11-16'"

    Das kann nicht funktionieren, weil das kein valides SQL ist.

    Nochmal: in der MySQL Connector Doku, die ich dir verlinkt habe, ist ein Beispiel für Platzhalter. Den Query, wie er funktionieren sollte, habe ich dir gepostet. D.h. du musst die beiden Sachen nur zusammen führen, was im gegebenen Fall Copy & Paste mit einer Minimodifikation ist.

    Schreib' doch den falschen Query erst mal so, dass das valides SQL ist. Dann baust du den Platzhalter ein.

    Dennis89 : f-String und Format-Strings möchte man für SQL-Queries nicht benutzen, weil das anfällig für SQL-Injections ist. Dafür definiert die DB 2.0 API ja die Platzhalter :)

    Gruß, noisefloor

  • Ich danke Euch für Eure Hilfe und Geduld. Habe dadurch die Lösung gefunden. Mit der Zeile

    sql = "select avg(temp) from wetterdaten1 where date(datum) = CURRENT_DATE"

    macht das kleine Programm das, was ich wollte.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!