WHERE LIKE Statement liefert kein Ergebnis

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

Hallo Zusammen,

folgende Methode erzeugt meine Datenbank:

Code: Alles auswählen

    def write_critical_errors(self, channels, asset_ids, error_timestamp):
        cursor_crit = self.connection2.cursor()

        sql_statement_crit = "CREATE TABLE IF NOT EXISTS CriticalError (channelname TEXT, Assetid TEXT, Timestamp TEXT)"

        try:
            cursor_crit.execute(sql_statement_crit)
            werte = {"channelname":channels, "Assetid":asset_ids,"Timestamp":error_timestamp}
            sql = "INSERT INTO CriticalError VALUES (:channelname, :Assetid, :Timestamp)"
            cursor_crit.execute(sql, werte)      
            self.connection2.commit()           
        except Exception as e:
            self.logger.error('writing_process for error critical failed', exc_info=True)
            self.connection2.rollback()
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Critical)
            msg.setText("Error")
            msg.setInformativeText('Could not perform sql writing process for critical errors')
            msg.setWindowTitle("Error")
            msg.exec_()   
Hier möchte ich die Spalte "Timestamp" folgendermaßen abfragen:

Code: Alles auswählen

    def clicked_show_day(self):
        date = self.ui.calendar.selectedDate()

        # Convert clicked date to timedelta object
        selected_date = date.toString("yyyy-MM-dd")
        print(selected_date)
        print(type(selected_date))
       # selected_date_converted = datetime.strptime(selected_date, "%Y-%m-%d")
        test = "SELECT rowid, channelname, Assetid, Timestamp FROM CriticalError WHERE Timestamp LIKE \'&"+selected_date+"&"+"\'"
        print(test)
        

        with closing(sqlite3.connect(r"D:\python_dev\GRAPHIC_ALARMING_MACHINE\DATABASE\critical_errors.db")) as connection:
                
            with closing(connection.cursor()) as cursor:
                cursor.execute(
                    "SELECT * FROM CriticalError WHERE Timestamp LIKE \'&"+selected_date+"&\'"
                )            
                critical_errors = cursor.fetchall() 

        print(critical_errors)
Ich habe einige Einträge, die beim "Timestamp" so anfangen: 2021-02-18 xx:xx:xx
Wenn ich nun aus dem QCalendar Widget die Zeit vom 18.02.2021 auswähle, erhalte ich einen String mit dem Format "2021-02-18". (Variable "selected_date")
Diese Abfrage liefert aber keine Ergebnisse, obwohl ich mindestens 10 Einträge mit dem Timestamp "2021-02-18 xx:xx:xx" habe. Die Uhrzeit interessiert mich nicht, deshalb habe ich Wildcards in der LIKE Abfrage genutzt...weiss jemand, wieso hier nichts gefunden wird?

So sieht die SQL Abfrage als String aus:
SELECT rowid, channelname, Assetid, Timestamp FROM CriticalError WHERE Timestamp LIKE '&2021-02-21&'

Wäre mega dankbar für einen Hinweis
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

Hallo Zusammen,

konnte es gerade lösen:

Die Abfrage muss so aussehen:
"SELECT * FROM CriticalError WHERE Timestamp LIKE \'"+selected_date+"_%_%_%\'"

Die Wildcards gelten wohl nicht für Leerzeichen oder ":"
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

Wenn du schon eine Spalte "timestamp" nennst, dann bietet es sich an auch etwas mit Zeit hineinzuschreiben, statt einfach nur einen Text.
Die sqlite3-Schnittstelle kann timestamp auf datetime.datetime mappen, dann kannst du dir das wilde Konstrukt sparen:

Code: Alles auswählen

    connection = sqlite3.connect(
        ":memory:",
        detect_types=sqlite3.PARSE_DECLTYPES |
        sqlite3.PARSE_COLNAMES
    cursor = connection.cursor()
    cursor.execute(
        """CREATE TABLE CriticalError
        (channelname TEXT, assetid TEXT, timestamp TIMESTAMP)
        """
    )
    # ...
    target_date = Date(2021, 2, 21)
    result = cursor.execute(
        "SELECT * FROM CriticalError WHERE date(timestamp)=?", (target_date,)
    )
Antworten