Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Abfrage Formulieren! Hilfe... (https://www.delphipraxis.net/21027-sql-abfrage-formulieren-hilfe.html)

Robert_G 29. Apr 2004 07:22

Re: SQL Abfrage Formulieren! Hilfe...
 
:gruebel:
Das hatte ich wohl gestern abend nach 5 1/2 h ICE-Fahrt falsch verstanden.
Sorry, falls es zu barsch klang...

nieurig 29. Apr 2004 12:39

Re: SQL Abfrage Formulieren! Hilfe...
 
Hi Delphi_fanatic,

Zitat:

Also nochmal : Windows verwaltet das Datum intern als Integer.
ich glaube das nicht.

Zitat:

Kannst Du ganz leicht ausprobieren : Starte Excel, gib' in irgendeine Zelle das heutige Datum ein - den
29.04.2004 - und dann Pulldown-Menü 'Format / Zellen' und klick da auf Zahl.
Dann siehst Du in dieser Excel-Zelle die windows-interne Ganz-Zahl, die für den 29.04.2004 steht,
nämlich 38106.
Gib in Excel mal "29.4.2004 10:23" ein und ändere das Format, und Du bekommst einen Floatwert. Wenn Du nur ein Datum eingibst speichert Excel die Uhrzeit 00:00 und stellt den Zahlenwert als Int dar.

Klar, der Vorkommateil ist das Datum und durch eine Umwandlung von Float in Int hast Du das Datum. Die interne Verwaltung bleibt trotzdem ein Float, bei dem eben der Nachkommateil die Uhrzeit darstellt.

Niels

Leuselator 29. Apr 2004 13:08

Re: SQL Abfrage Formulieren! Hilfe...
 
@Delphi_Fanatic: Du solltest vorsichtig mit allgemeingültigen Aussagen wie:
Zitat:

und das Du locker im Zusammenhang mit SQL-Queries verwenden kannst. Jedenfalls bei Microsoft-Datenbanken wie Access.
sein, da der MSSQL-Server eben einen anderen (+2Tage) Datetime-Startwert oder Ausgangspunkt hat als MS-Windows und somit Probleme bei Deinem vorgeschlagenen Weg unausweichlich sind.

Man kann mit Datumswerten in der von Dir genannten Weise operieren, allerdings sollte man eben genau wissen, was intern abgeht.

Gruß

Gollum 29. Apr 2004 13:39

Re: SQL Abfrage Formulieren! Hilfe...
 
Hallo,

das Datum wird bei allen Datenbanken und bei Windows als Fließkommazahl behandelt, da sonst kein Zeitanteil mit übergeben werden kann.

Zitat:

Zitat von nieurig
Wenn Du Parameter verwendest kümmert sich Delphi drum.

Das stimmt so nicht.

Ich habe mir dafür extra Funktionen geschrieben, die das Datum in die entsprechende Schreibweise für die verschiedenen DB's umwandelt.

@celinaw
Folgendes sollte funktionieren:
Delphi-Quellcode:
function FmtDateMySQL(const aDate:TDateTime; const withTime:Bool=False);
var t, m, j, std, min, sek, hs:Word;
begin
  DecodeDate(aDate, j, m, t);
  if (withTime)
  begin
    DecodeTime(aDate, std, min, sek, hs);
    Result:=Format('%d-%0.2d-%0.2d %0.2d:%0.2d:%0.2d', [j, m, t, std, min, sek]);
  end else Result:=Format('%d-%0.2d-%0.2d', [j, m, t]);
end; // FmtDateMySQL
Für Dein Beispiel:
Delphi-Quellcode:
qryMain.Parameters[0].Value := FmtDateMySQL(StrToDate(EdBegenn.Text));
qryMain.Parameters[1].Value := FmtDateMySQL(StrToDate(EdEnde.Text));

Delphi_Fanatic 29. Apr 2004 13:54

Re: SQL Abfrage Formulieren! Hilfe...
 
@Leueselator :

Zitat:

sein, da der MSSQL-Server eben einen anderen (+2Tage) Datetime-Startwert oder Ausgangspunkt hat als MS-Windows und somit Probleme bei Deinem vorgeschlagenen Weg unausweichlich sind.
MS SQL-Server ist weder von mir, noch vom Thread - Eröffner explizit erwähnt worden.
Trotzdem würde mich jetzt mal interessieren :
An welcher Stelle wird denn diese '+2-Konvertierung' automatisch vorgenommen, wenn man einen Datums-Wert an einen query.parameter übergibt ?

Zitat:

allerdings sollte man eben genau wissen, was intern abgeht.
Ich lasse mich gerne 'eines Besseren belehren', aber Tatsache ist doch, dass der Datums-Integer, der im Delphi-Programm abgegriffen wird, definitiv immer derselbe ist. Egal, ob man ihn nach der von mir beschriebenen Möglichkeit oder nach irgendeiner anderen Möglichkeit abgreift.

Die Quelle bzgl. dieses Datums-Wertes ist in jedem Falle doch dieselbe. Lediglich das Ziel war bei mir ein Anderes : Ich wollte den Datums-Integer direkt in SQL.Text reinschreiben, Du wolltest den Weg über Query.Parameter gehen.

Also wenn bei der Benutzung von Query.Parameter automatisch irgendwo diese +2-Konvertierung statt findet - dann hättest Du natürlich recht... ansonsten müßtest Du diese Konvertierung doch bei beiden Methoden machen ...

Robert_G 29. Apr 2004 14:11

Re: SQL Abfrage Formulieren! Hilfe...
 
Zu einer vernünftigen DB, gibt es vernünftige native Zugriffsmöglichkeiten oder OLE DB Treiber.
Diese wandeln das Datum entsprechend um. Während der MS SQL Svr irgendwann 1899 oder so anfängt macht es Oracle ähnlich wie .Net (nur das es ein Byte pro Segment bzw. Integer für das Jahr ist).
Wichtig ist doch dabei nur, dass hinten das rauskommt, was verlangt wird...

Ich glaube Gollum hat schon eine Lösung für Celinas Problem gepostet.
Auch wenn ich es generell für nicht sinnvoll halte in einem Datum mit dem Like operator zu suchen. :? (Es wird in 90% aller Anfragen nach irgendwelchem Käse gesucht und gefunden werden die Löcher :P )

Diese ganze Integer/Double/DateTime-Diskussion war wohl schon OT & aussichtslos als sie angefangen hatte... :mrgreen:

Sharky 29. Apr 2004 14:15

Re: SQL Abfrage Formulieren! Hilfe...
 
Zitat:

Zitat von Robert_G
...war wohl schon OT & aussichtslos als sie angefangen hatte...

Und darum bitte ich alle sich wieder direkt mir der Frage zu beschäftigen und, wenn es denn notwendig ist, für diese Diskussion einen entsprechenden Thread zu starten.

Danke :-D

celinaw 30. Apr 2004 00:04

Re: SQL Abfrage Formulieren! Hilfe...
 
Hi :hello:

Nach langem ausprobieren hab ich es endlich hin bekommen :mrgreen:

Ich habe mehrere Lösungen ausprobiert!

Das von Mikhal funktioniert nur wenn man im Editfeld das Datum wie folgt schreibt: 2004-04-24
Zitat:

'WHERE T.FIRST_EVENT BETWEEN ' + StrToDate(EdBegenn.Text) + ' AND ' + StrToDate(EdEnde.Text)

Was bissher Problemlos läuft ist der Code von Gollum!
Zitat:

function FmtDateMySQL(const aDate:TDateTime; const withTime:Bool=False);
var t, m, j, std, min, sek, hs:Word;
begin
DecodeDate(aDate, j, m, t);
if (withTime)
begin
DecodeTime(aDate, std, min, sek, hs);
Result:=Format('%d-%0.2d-%0.2d %0.2d:%0.2d:%0.2d', [j, m, t, std, min, sek]);
end else Result:=Format('%d-%0.2d-%0.2d', [j, m, t]);
end; // FmtDateMySQL



Ich hatte nur so einige Probleme mit den Parametern. Habs aber dann nach einigem lesen und probieren hin bekommen.


Euch allen kann ich nur sagen:

Vielen Vielen Dank für die Hilfe :mrgreen:


Gruß Celina


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:20 Uhr.
Seite 2 von 2     12   

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