Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#1

DateTime-Konstanten in SQL-Anweisungen benutzen

  Alt 26. Mär 2004, 17:48
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]
Andreas
  Mit Zitat antworten Zitat