Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi In der MSSQL-Datenbak nach Datum suchen??? (https://www.delphipraxis.net/53487-der-mssql-datenbak-nach-datum-suchen.html)

romber 17. Sep 2005 14:08

Datenbank: MSSQL Server • Version: 2000 • Zugriff über: ADO

In der MSSQL-Datenbak nach Datum suchen???
 
Hallo!

Ich habe in der Tabelle eine Spalte namens "orderdate", in der die Datum jeder Bestellung im Format "smalldatetame" (dd.mm.yyyy) gespeichert wird. Ich möchte nun z.B. alle Bestellungen für September 2005 sehen. Die Code

Delphi-Quellcode:
 ...
var
datum: string;
begin
  with ADOQuery1 do
  begin
    active := false;
    sql.clear;
    datum := '%.09.2005';
    sql.Text := 'SELECT * FROM BESTELLUNGEN' + #10 + 'WHERE orderdate LIKE :BestelltAm';
    ParamCheck := true;
    Parameters.ParamByName('BestelltAm').Value := datum;
    active := true;
    open;
  end;
...
scheitert mit der Meldung Die Anwendung verwendet für den aktuellen Vorgang einen Wert vom falschen Typ. Klar, dass den Wert in der Tabelle von Typ smalldatetime ist und ich es mit einem String vergleiche. Aber wie mache ich das denn nun? Parameters.ParamByName ist vom Typ Variant, da kann man also den Wert vom Typ TDateTime angeben, aber wie bringe ich mein Parameter in diesen Format?

marabu 17. Sep 2005 14:19

Re: In der MSSQL-Datenbak nach Datum suchen???
 
Hi romber,

einen Zeitraum kannst du mit SELECT ... WHERE orderdate BETWEEN :primo AND :ultimo auswählen. Wenn du mit LIKE arbeiten willst, dann darfst du nicht mit orderdate direkt arbeiten, sondern musst mit einem CAST(orderdate AS CHAR(10)) AS c_orderdate dafür sorgen, dass der LIKE Operator den richtigen (string) Datentyp vorfindet.

Grüße vom marabu

romber 17. Sep 2005 14:40

Re: In der MSSQL-Datenbak nach Datum suchen???
 
Danke für schnelle Antwort!

Wie wird die Abfrage dann aussehen?

marabu 17. Sep 2005 15:07

Re: In der MSSQL-Datenbak nach Datum suchen???
 
So:

SQL-Code:
SELECT * FROM bestellungen WHERE orderdate BETWEEN :primo AND :ultimo
Oder habe ich dich falsch verstanden?

marabu

romber 17. Sep 2005 15:13

Re: In der MSSQL-Datenbak nach Datum suchen???
 
Zitat:

Zitat von marabu
SQL-Code:
SELECT * FROM bestellungen WHERE orderdate BETWEEN :primo AND :ultimo
Oder habe ich dich falsch verstanden?

Das ist klar. Ich würde aber besser die CAST-Funktion benutzen. Ich habe so versucht

SQL-Code:
SELECT * FROM bestellungen WHERE CAST(orderdate AS CHAR) LIKE :datum
es werden aber überhaupt keine Ergebnisse angezeigt.

alzaimar 17. Sep 2005 15:20

Re: In der MSSQL-Datenbak nach Datum suchen???
 
Kein Wunder: Wenn überhaupt, dann CAST (Foo as Char (12)) oder so, Du verwandelst das Datum in genau ein Zeichen... bisserl wenig.
Mit dem like geht es zwar theoretisch, da MSSQL implizite Typunwandlungen vornimmt, aber ich wüsste nicht, in welches der vielen Datumsformate das Datum konvertiert wird. Desweiteren glaube ich nicht, das das sonderlich schnell ist.

Mach es so, wie marabu es vorgeschlagen hat.

Union 17. Sep 2005 16:12

Re: In der MSSQL-Datenbak nach Datum suchen???
 
Du kannst auch Date und Year verwenden bzw. Datepart:

SQL-Code:
Select * from Auftrag where Month(Datum) = :Monat and Year(Datum) = :Jahr
order
SQL-Code:
Select * from Auftrag where Datepart(Month, Datum) = :Monat and DatePart(Year, Datum) = :Jahr
Deine ursprünglich geplante Abfrage mit LIKE würde so funktionieren:
SQL-Code:
// SQL-Server konvertiert Datumswerte automatisch in Strings: yyyy-mm-dd hh:nn:ss.zzzz
Select * from Auftrag where Datum like :Datum
... und den Wert füllst Du dann so:
Delphi-Quellcode:
AdoQuery.ParamByName('Datum').AsString := FormatDateTime('yyyy-mm',dtPruefmonat)+'%';
AdoQuery.Open;

romber 18. Sep 2005 23:26

Re: In der MSSQL-Datenbak nach Datum suchen???
 
Danke!


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

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