Bei
SQL-Abfragen bringt ein Datums oder Zeitfeld
häufig Probleme ins Haus, da in
SQL das Format nicht definiert
wurde und jeder
DBMS-Hersteller sein eigenes Süppchen kocht.
Daher muss man Datums/Zeitwerte in Parametern übergeben und die
Treiber sorgen im Hintergrund für die richtige Umwandlung.
Was aber tun, wenn die
SQL-Abfrage dynamisch vom Benutzer/Programm
erzeugt wird ?
Zumindest für den MS
SQL-Server und für MS
Access gibt es hier eine
Lösung.
Folgende Funktionen arbeiten unabhängig von eingestellten Datums-/Zeitformat.
Delphi-Quellcode:
function DateTimeToSQLServerDateTimeString(value: TDateTime):
string;
begin
Result := '
{ ts'+QuotedStr(FormatDateTime('
yyyy-mm-dd hh":"nn":"ss.z', value))+'
}';
end;
function DateTimeToSQLServerDateString(value: TDateTime):
string;
begin
Result := '
{ d'+QuotedStr(FormatDateTime('
yyyy-mm-dd', value))+'
}';
end;
function DateTimeToSQLServerTimeString(value: TDateTime):
string;
begin
Result := '
{ t'+QuotedStr(FormatDateTime('
hh":"nn":"ss.z', value))+'
}';
end;
procedure CharReplace(
var S: AnsiString;
const Search, Replace: AnsiChar);
var
i : Integer;
begin
for i := 1
to Length(S)
do
if S[i]=Search
then
S[i]:=Replace;
end;
function DateTimeToAccessDateTimeString(value: TDateTime):
string;
begin
// Da Access (Jet-Engine) ein Datum als Double speichert...
Result := FloatToStr(value);
CharReplace(Result, '
,', '
.');
end;
Hier noch ein Beispiel für den
SQL-Server:
Delphi-Quellcode:
// Zeige Aufträge geliefert innerhalb der letzten 30 Tage
Query1.SQL.Text := 'SELECT * FROM Auftrag';
Query1.SQL.Add('WHERE Lieferdatum>'+DateTimeToSQLServerDateTimeString(now-30.0);
[edit=Matze]Code formatiert. Mfg, Matze[/edit]