Aggregat auf Datum (Text) aus Datenbank

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,
    für die Anzeige, wann meine Software das letzte Mal gestartet wurde, schreibe ich das Datum via SQL in eine SQLite Datenbank in ein Textfeld. Dabei wird das Datum so gebildet.

    Code
    timestamp = time.strftime("%d.%m.%Y %H:%M:%S")

    Es kommt beispielsweise

    30.03.2017 11:32:27

    dabei raus.

    Ich lese dann, bei einem Neustart das Datum aus der SQLite Datenbank mit:

    Code
    dbcursor.execute("SELECT max(timestamp) AS datum FROM `logdaten` where aktion = " + "'System neu gestartet'")
    for datensatz in dbcursor:
        LastStarttime  = str(datensatz[0])

    wieder ein um anzuzeigen wann die Software das letzte Mal gestartet wurde.

    Funktioniert auch, aber es kommt nicht das neueste Datum, sondern immer der 30.03.2017 11:32:27. Klar das liegt daran, dass "Max" das Datum als Text behandelt und da ist 30.03.2017 11:32:27 natürlich mehr als der 01.07.2017 20:34:12.

    Ich müssten also dem Max sagen, dass es sich um ein Datum handelt. Nach einiger Recherche fand ich zwei Ansätze, die beide leider (noch) nicht funktionieren.

    Einmal das "AS datum" in der Execute Syntax, wobei ich es auch schon mit "AS date" und "AS DT" versucht habe. Und zum anderen mit der Funktion time.strptime, die angeblich einen Text in ein Datum verwandelt.

    Code
    print(time.strptime(timestamp,'%d.%m.%Y %H:%M:%S'))

    funktioniert auch, aber in dem Execute, also:


    Code
    dbcursor.execute("SELECT max(time.strptime(timestamp,'%d.%m.%Y %H:%M:%S')) AS DT FROM `logdaten` where aktion = " + "'System neu gestartet'")
    for datensatz in dbcursor:
        LastStarttime  = str(datensatz[0])

    führt es zu einer Fehlermeldung:

    Code
    Traceback (most recent call last):
      File "/home/pi/tormann/tormann_neu.py", line 1074, in <module>
        dbcursor.execute("SELECT max(time.strptime(timestamp,'%d.%m.%Y %H:%M:%S')) AS DT FROM `logdaten` where aktion = " + "'System neu gestartet'")
    OperationalError: near "(": syntax error


    Ich steh auffem Schlauch.. :s

    Hat jemand eine Idee wo mein Fehler liegt oder einen besseren Ansatz das zu lösen?

    Vielen Dank im Voraus
    Ralf

  • Hallo,

    das schönste wird sein du fügst es nicht als Text ein sondern als Datetime. Dann sollte es mit der Struktur auch gehen.

    Alternativ wäre ein einfacher Ansatz eine ID Spalte als Key einzubauen. Mit auto_increment. Dann ist der letzte Insert immer die größe ID.

    Viel Erfolg.

  • Hallo,

    wenn du das Zeitstempel als Unix Timestamp speicherst ist es noch einfacher.

    Und zeig' mal bitte dein `CREATE TABLE` Statement.


    Die Art, wie du die DB abfragst, also wie du das `SELECT` Statement zusammenbaust, ist stilistisch ganz schlecht. Und wäre offen für SQL-Injections. Wie es richtig geht, steht in der Python-Doku: https://docs.python.org/3/library/sqlite3.html#

    Gruß, noisefloor

  • Zitat von &quot;Dave0408&quot; pid='298852' dateline='1504869940'


    Hallo,

    das schönste wird sein du fügst es nicht als Text ein sondern als Datetime. Dann sollte es mit der Struktur auch gehen.

    Alternativ wäre ein einfacher Ansatz eine ID Spalte als Key einzubauen. Mit auto_increment. Dann ist der letzte Insert immer die größe ID.

    Viel Erfolg.

    Hallo Dave,

    manchmal sind die nahe liegenden Ideen die besten. Da ich bereits ein Feld rowid in meinen Daten hatte, konnte ich das leicht umsetzen. Sieht jetzt so aus und funktioniert.

    Code
    dbcursor.execute("SELECT max(rowid), timestamp FROM `logdaten` where aktion = " + "'System neu gestartet'")
    for datensatz in dbcursor:
        LastStarttime  = str(datensatz[1])


    Hallo Lauter Boden.. ;)

    Create Table ist

    Was meinst Du mit offen für SQL- Injektions? Welcher Art? Da wird nichts über Browser oder Internet aufgerufen, sondern nur vom Programm auf der Maschine. Und wie wäre der Stil den besser? Bin immer offen für Anregungen. :thumbs1:

    LG
    Ralf

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!