Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   FreePascal TSQLQuery.Filter auf DateTime-Feld funktioniert nicht (mysql) (https://www.delphipraxis.net/184738-tsqlquery-filter-auf-datetime-feld-funktioniert-nicht-mysql.html)

PASST 17. Apr 2015 12:10

Datenbank: MySQL • Version: 5.1 • Zugriff über: TMySQL51Connection

TSQLQuery.Filter auf DateTime-Feld funktioniert nicht (mysql)
 
Hallo allerseits,
ich nutze Lazarus 1.2.6 unter Win7 x64 mit einer MySQL-Datenbank.

Ich möchte die Filter-Eigenschaft eines TSQLQuery nutzen. Dies funktioniert aber nicht bei einem Feld vom Datentyp DateTime. Der Filter funktioniert bei einem Feld vom Typ VarChar erfolgreich.

Ich habe bereits folgendes versucht:
Filter := 'date(Feldname)=curdate()';
Als Fehler erhalte ich zur Laufzeit: 'index based on unknown filed "date"'

Filter := 'Feldname>=' + QuotedStr('2015-04-17 00:00:00');
Fehlermeldung: 'index based on unknown filed ">="'

Verwende ich dagegen die obere Variante 'date(Feldname)=curdate()' als Bedingung im SQL.Text, so funktioniert alles wie gewünscht. Ich möchte allerdings die Filter-Eigenschaft verwenden, um nicht zur Laufzeit mit dem SQL.Text spielen zu müssen.

Hat jemand eine Idee?

Gruß,
Peter

Bernhard Geyer 17. Apr 2015 12:24

AW: TSQLQuery.Filter auf DateTime-Feld funktioniert nicht (mysql)
 
Wie so oft gesagt: Verwende parametrisierte Abfragen und hört das zusammengestöpsel der SQL-Statments auf.
Bei parametrisierten Abfragen verschwinden viele Problem die man sonst mit einem zusammengestöpselten Where-Konstrukt hat.

himitsu 17. Apr 2015 12:33

AW: TSQLQuery.Filter auf DateTime-Feld funktioniert nicht (mysql)
 
Erstmal ist das garnicht vergleichbar, denn du hast nicht nur den zweiten Parameter geändert (so wie du es behauptest), sondern auch den ersten Parameter (ohne Cast) und auch noch den Operator.

SQL-Code:
Filter := 'date(Feldname) = curdate()';
Filter := 'date(Feldname) = date(' + QuotedStr('2015-04-17') + ')';

Parameter im Filter ist ja leider so nicht möglich :cry:, wäre aber ein nettes Feature.

Bernhard Geyer 17. Apr 2015 12:35

AW: TSQLQuery.Filter auf DateTime-Feld funktioniert nicht (mysql)
 
Zitat:

Zitat von himitsu (Beitrag 1298213)
Parameter im Filter ist ja leider so nicht möglich :cry:

Argh. Ist da diese komische Client-Filterung. Das würde ich eh wegschmeißen und richtig (per Parameter) SQL-Statements zum Server schicken um nur die relevanten Daten zu bekommen.

himitsu 17. Apr 2015 14:21

AW: TSQLQuery.Filter auf DateTime-Feld funktioniert nicht (mysql)
 
Die xxDACs (z.B. PgDAC) haben teilweise mehrere Filter.
Der clientseitige (vom TDataSet) und einen Weiteren, der genauso aussieht/behandlet wird, welcher sich aber hintenrum (intern) ins WHERE reinschreibt.

Local filtern geht aber schneller, wenn man sowieso zuerst alles anzeigt und erst dann später mal filtert. (keine weiteren DB-Abfragen)

BadenPower 17. Apr 2015 14:40

AW: TSQLQuery.Filter auf DateTime-Feld funktioniert nicht (mysql)
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1298214)
Argh. Ist da diese komische Client-Filterung. Das würde ich eh wegschmeißen und richtig (per Parameter) SQL-Statements zum Server schicken um nur die relevanten Daten zu bekommen.

Manchmal möchte man auch kurzzeitig nur 100.000 von 2.000.000 Zeilen in der Anzeige haben und das ohne jedesmal die Server unnötig zu quälen.

PASST 17. Apr 2015 15:15

AW: TSQLQuery.Filter auf DateTime-Feld funktioniert nicht (mysql)
 
Ok, ich versuche es jetzt mal mit der parametrisierten Abfrage, habe aber schon meine erste Frage.
Code:
// Folgende Query mit Parametern:
SELECT Zeitstempel, Name
FROM Tabelle
WHERE Name LIKE :parName
AND DATE(Zeitstempel)=:parHeute
Eigentlich möchte ich beide Bedingungen flexibel gestalten, dh. auch alle Werte anzeigen lassen können. Bei parName='%' kommt das hin, aber wie klappt das für parHeute?

Gruß,
Peter

mkinzler 17. Apr 2015 15:17

AW: TSQLQuery.Filter auf DateTime-Feld funktioniert nicht (mysql)
 
Z.B. so

SQL-Code:
SELECT
  Zeitstempel, Name
FROM
  Tabelle
WHERE
  Name LIKE :parName AND
  (DATE(Zeitstempel)=:parHeute OR :Alle = 1);

PASST 17. Apr 2015 15:47

AW: TSQLQuery.Filter auf DateTime-Feld funktioniert nicht (mysql)
 
Danke, da muss man mal wieder um die Ecke denken ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz