![]() |
Datenbank: Paradox • Version: 9 • Zugriff über: Query
Zeit/Datumswert mit einer Tabelle vergleichen
Aloha :hi:
Ich hoffe ich kann euch mein Problem halbwegs verständlich machen... Ich habe eine Tabelle mit einer Spalte _BackUpTime vom Typ DateTime, deren Inhalt so aussieht "15:11:45, 17:11:2006" Dies habe ich jeweils in Zeit und Datum getrennt und zur weiteren Bearbeitung als String umgewandelt. Jetzt habe ich beide wieder zusammengefügt und wollte sie wieder mit der Datenbank zu vergleichen.
Delphi-Quellcode:
Wenn ich datumzeit in einen Datums/Zeit typ umwandle bekomme ich eine Fehlermeldung, dass es sich um ein ungültiges Datum handelt. Lass ich datumzeit als String, bekomme ich zwar keine Fehlermeldung aber auch keine Ergebnisse :gruebel:
datumzeit:= DBGZeit.SelectedField.AsString + ', '+ DBGdatum.SelectedField.AsString ;
with DBmodul.QcopyTable do begin Close; SQL.Clear; SQL.Add('SELECT * FROM Aufdate WHERE AuftragNr = '+DBGrid1.SelectedField.AsString + ' AND ("_BackUpTime" = :datzeit)'); ParamCheck:=true; ParamByName('datzeit').AsDateTime:= StrToDateTime(datumzeit); Open; end; Ich steh grad ein bisschen auf dem Schlauch ... |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Du brauchst auf jeden Fall ein Datumsformat, dass StrToDateTime verarbeiten kann.
Delphi-Quellcode:
// zuerst das Datum dann die Zeit getrennt durch ein Leerzeichen
datumzeit:= DBGdatum.SelectedField.AsString + ' '+ DBGZeit.SelectedField.AsString; |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Zitat:
Zitat:
|
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Wie sehen die Metadaten der Tabelle aus?
BTW. Ein Vergleich von Datumswerten als String ist keine gute Idee. |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Wie sieht denn die Variable datumzeit aus, nachdem Du sie zusammengesetzt hast?
|
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Genauso wie der Wert in der Tabelle, also um beim Beispiel von oben zu bleiben, sieht die Variable auch so aus "15:11:45, 17:11:2006"
|
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Solange TimeSeparator und DateSeparator gleich sind, wirst Du mit den automatischen Umwandlungsfunktionen (StrTo...) nicht weit kommen. Du müsstest Dir das Datum aus dem String selber zusammenbasteln.
|
Re: Zeit/Datumswert mit einer Tabelle vergleichen
und was mach ich dann mit dem Komma ... :gruebel:
|
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Also auf die harte Tour könnte man es so machen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var datumzeit : string; hh, nn, ss, yy, mm, dd : Word; begin // 1 // 12345678901234567890 datumzeit := '15:11:45, 17:11:2006'; hh := strtoint(copy(datumzeit, 1, 2)); nn := strtoint(copy(datumzeit, 4, 2)); ss := strtoint(copy(datumzeit, 7, 2)); dd := strtoint(copy(datumzeit,11, 2)); mm := strtoint(copy(datumzeit,14, 2)); yy := strtoint(copy(datumzeit,17, 4)); // Das Ergebnis des EncodeDateTime dann in den SQL-Parameter schreiben ShowMessage(DateTimeToStr(EncodeDateTime(yy, mm, dd, hh, nn, ss, 0))); end; |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Zitat:
Davon mal abgesehen stellt sich mir immer noch die Frage, wie kommt es zu dieser doch merkwürdigen Anzeige? Das Tabellenfeld scheint ja doch vom Typ DateTime zu sein... Wie hast du den FeldInhalt angezeigt? Mal direkt über die DatenbankOberfläche bzw den DatenbankExplorer oder kommt der gleich aus einer SQL-Abfrage? Ist irgendwo speziell für dieses Feld im FeldEditor (ObjektInspektor!) ein DisplayFormat in der o.a. Form eingegeben?? Mir will es einfach nicht in den Kopf, dass eine 'schnöde' ParadoxTabelle (sorry für den Ausdruck) ein DateTime-Feld so 'verkorkst' darstellt :gruebel: Da muss irgendwo anders noch was gedreht worden sein... |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Hallo Simone,
vielleicht besser so:
Delphi-Quellcode:
Gute Nacht
const
SELECT_STMT = 'SELECT * FROM Aufdate A WHERE AuftragNr = :auftrag AND A."_BackupTime" = :datzeit' ; var datZeit: TDateTime; begin datZeit := DBGZeit.SelectedField.AsDateTime; with DBmodul.QcopyTable do begin SQL.Text := SELECT_STMT; // ParamCheck := True; // Im OI reicht ... Params.ParamByName('auftrag').AsInteger := DBGrid1.SelectedField.AsInteger; Params.ParamByName('datzeit').AsDateTime:= datZeit; Open; end; |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Zitat:
Richtig wäre eigentlich "15:11:45, 17.11.2006" gewesen. Sorry, das war echt keine Absicht :wall: |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Zitat:
Trotz alledem muss ich nochmal auf das hier zurückkommen: Zitat:
Und wie hast du diesen merkwürdigen Feldinhalt in einen String reinbekommen, um diesen dann nach Datum und Zeit zu trennen? Nochmal: hast du dir die Tabelle und speziell das Feld mit der DB-Oberfläche oder ähnlichem Delphi-eigenem Dateibetrachter angeschaut? Steht das da wirklich so drin??? :gruebel: Sorry, alle bisher gemachten Vorschläge zwecks DatumZeit-'Umwandlung' für die Query können m.E. zu nichts führen (ausser zu Fehlern), weil IMHO irgendetwas mit dem FeldInahlt nicht stimmt :gruebel: :gruebel: |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
with DBmodul.Qbackuptime do
begin Close; SQL.Clear; SQL.Add('SELECT Aufdate."_BackUpTime" AS Datum FROM Aufdate WHERE '+ Spaltename+ ' = :zelleNr'); ParamCheck:= true; ParamByName('zelleNr').AsInteger:= StrToInt(Nr); Open; end; datumzeit:= dbmodul.Qbackuptime.FieldByName('Datum').AsDateTime; with dbmodul.Qdatum do begin [...] FieldByName('Datum').AsString:= DateToStr(datumzeit); //Datum FieldByName('Zeit').AsString:= TimeToStr(datumzeit); //Zeit [...] end; Zitat:
|
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Besten Dank Simone!
Allerdings komme ich einfach nicht mit dem 'Format' des DateTime-Feldes klar; scheint mir echt ne 'Neuerung' in Paradox 9 zu sein :gruebel: Wo bzw wie wird überhaupt die BackupTime bzw dieses Tabellenfeld gefüllt??... Sorry, wenn ich dumme Fragen stelle, aber wie bereit gesagt; ich blick da nicht mehr durch *schulterzuck* :roll: |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Hi,
wenn das Feld vom Type ftDateTime (@) ist, dann ist mir doch die Darstellung in Paradox 9 egal. Ich bleibe vorerst bei meinem Lösungsansatz aus Beitrag #12. Freundliche Grüße |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Zitat:
@Simone: ähnliche Irritation ist dir insofern ja auch unterlaufen ;) siehe #1
Code:
So dürfte es dann funktionieren:
datumzeit:= DBGZeit.SelectedField.AsString + ', '+ DBGdatum.SelectedField.AsString ;
Code:
und natürlich das was marabu gesagt hat...
datumzeit:= DBGDatum.SelectedField.AsString + ' ' + DBGZeit.SelectedField.AsString ;
Viel Erfolg! |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Also ich hab das jetzt nochmal probiert, aber irgendwas mach ich immer noch falsch :roll:
Jetzt bekomme ich den Fehler zurück, dass die Typen im Ausdruck nicht übereinstimmen. :gruebel:
Delphi-Quellcode:
const
SELECT_STMT = 'SELECT * FROM "[...]\Aufdate" WHERE AuftragNr = :auftrag AND "_BackupTime" = :datzei'; datumzeit:= DBGzeit.SelectedField.AsDateTime + DBGdatum.SelectedField.AsDateTime; with DBmodul.QcopyTable do begin Close; SQL.Clear; SQL.Text:= SELECT_STMT; ParamCheck:=true; ParamByName('auftrag').AsInteger := DBGrid1.SelectedField.AsInteger; ParamByName('datzei').AsDateTime:= datumzeit; Open; end; |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Hallo Simone,
du hast vergessen die Zeile zu markieren, in welcher der Compiler meckert. Die Zuweisung an SQL.Text macht ein vorheriges SQL.Clear überflüssig. Die Eigenschaft ParamCheck setzt man in der Regel nur einmal und dann im OI. Freundliche Grüße |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Hallo,
die beiden Sachen habe ich geändert, und der Compiler meckert beim "Open". Also wird was in der Abfrage nicht stimmen :gruebel: |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Wenn du den Fehler nicht selbst findest musst du mal das DDL Statement für die Tabelle zeigen.
|
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Hallo,
Dein Feld dattimne ist vom Typ TimeStamp fasst vielleicht nur die beiden Werte zusammen. Warum machst du das nicht auch so ? Ich habe mal auf die Schnelle eine Tabelle angelegt.
SQL-Code:
oder Delphi per TTable (ihhh ;))
create table test(id integer, dattime timestamp, primary key(id))
insert into test(dattime) values('1.12.2006 12:00:00')
Delphi-Quellcode:
var
tdtDate, tdtTime : TDateTime; FieldByName('dattime').AsDateTime:= tdtDate+tdtTime. Heiko |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Zitat:
@hoika ich habe es so probiert, allerdings bleibt es trotzdem bei der Fehlermeldung, dass die Typen nicht übereinstimmen :cry: Das entpuppt sich ja schwerer als erwartet :| |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Hallo,
dann nimm mal AsFloat statt AsDateTime. Heiko |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Es ändert sich leider trotzdem nichts, die Fehlermeldung ist die gleiche :-(
|
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Hi.
Ich hab die Datenbank verbrochen, also wenn's um die Datenbank an sich geht, bitte mich fragen. ;) Ja, ich weiß, ich hätte es auch anders machen können (Datum/Zeit getrennt und den "_" bei BackUpTime hätte ich auch weglassen können, aber es sollte halt schnell gehen), aber nun ist zu spät. Sorry, Simone :kiss: Nunja. Also der Tabellen-Typ ist Paradox 7. Nur damit keine Verwirrung auftritt. Wir arbeiten hier zwar mit Paradox 9, aber das nutzt im Endeffekt auch nur die Tabellen vom 7er. So. Zum Problem an sich. Bei jeder Änderung an den Daten werden diese noch mal weggespeichert und mit diesem jenen Zeitstempel versehen, damit man diese identifizieren kann. Nun soll SilverMoonGirl ein Paradox-externes Programm schreiben (jetzt halt in Delphi), welches diese Daten bei Bedarf wieder zurückholen kann. Der Kunde wählt quasi Vorgangsnummer, Datum und Uhrzeit und dann soll sie es raussuchen. Da gibt's jetzt halt das Problem das die Abfrage nicht funktionieren will. Von den Delphi-Komponenten hab ich jetzt leider nicht so die Ahnung. Da müsst ihr euch wieder an SilverMoonGirl wenden ;) Jetzt unabhängig von dem Problem. Wie fragt man denn einen DateTime-Wert richtig ab? Jetzt auch noch unabhängig davon das er erst zusammengesetzt werden muss? Danke. :) |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Hallo,
wie ihr beiden seht, gibt es nur Ärger. Ich würde die Struktur ändern und per Programm-Update, die alten Daten ersetzen. Abfrage ist wegen dem zusammengestezten Feld extrem schwierig, normalerweise kann man eine Date / Time Feld per Extract (z.B. Extract(Year From DateField)) auseinandernehmen, das läuft aber ohne Index, ist also saulahm. Poste doch mal eine Bsp-Tabelle mit 2/3 Datensätzen. Heiko |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Hallo Leute,
grundsätzlich muss bei der Abfrage über LocalSQL unterschieden werden, ob man per Parameter abfragt oder nicht:
Delphi-Quellcode:
Die Datum- und Zeit-Literale bei der Parameterbesetzung richten sich nach den Ländereinstellungen des Benutzers. Die Anzeige von von Date- und Time-Feldern über die BDE erfolgt nach den gleichen Regeln, TimeStamp-Felder (@) werden im Format "TIME, DATE" angezeigt. Allerdings müssen die Literale bei der LocalSQL-Abfrage gemäß den Vorgaben der BDE-Konfiguration erfolgen. Diese unterscheidet sich oft von den Systemeinstellungen.
begin
with Query do begin SQL.Text := 'SELECT * FROM T1 WHERE ts = :ts'; Params.ParamByName('ts').AsDateTime := StrToDate('2006-12-21') + StrToTime('12:08:04'); Open; end; with Query do begin SQL.Text := 'SELECT * FROM T1 WHERE CAST(ts AS TIME) = ''12:08:04'' ' + 'AND CAST(ts AS DATE) = ''21.12.2006'' '; Open; end; end; Ansonsten gilt immer noch das, was ich in Beitrag #12 geschrieben habe. Freundliche Grüße |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Zitat:
Zitat:
Zitat:
@marabu OK. Dann testen wir es morgen mal mit den BDE-Konfig-Einstellungen (die fassen wir so nie an, sollten also Standard sein). |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Tja,
mein Paradox-Wissen wird zum Glück immer kleiner (wird gerade von FB2.0 aus dem Hirn gedrückt ;)) Heiko |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Zitat:
@Silvermoon: leicht veränderte SQL
Delphi-Quellcode:
Zum Fehler (unterschiedliche Typen im Ausdruck): der könnte ja auch vom ersten Parameter 'auftrag' ausgelöst werden, wenn Auftragsnummer nicht Integer ist!? Um das herauszufinden, änderst halt testweise das SQL.Statement so, dass jeweils nur ein Parameter in der WHERE-Klausel enthalten ist...
const
SELECT_STMT = 'SELECT * FROM "[...]\Aufdate" WHERE AuftragNr = :auftrag AND "_BackupTime" = :datzei'; datumzeit:= with DBmodul.QcopyTable do begin Close; SQL.Text:= SELECT_STMT; ParamByName('auftrag').AsInteger := DBGrid1.SelectedField.AsInteger; ParamByName('datzei').AsDateTime:= DBGzeit.SelectedField.AsDateTime + DBGdatum.SelectedField.AsDateTime; ; Open; end; |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Zitat:
|
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Ich hab mal gerade blind was zusammengeklickt (hab ja halt jetzt nicht die Erfahrung damit)
Also ein DataSource mit einer Query verknüft und das DataSource mit dem GUI-Tabellen-Objekt. Dann auf nen Schalter, das:
Delphi-Quellcode:
Das hatte jetzt geklappt... naja. Wie gesagt, halt morgen noch mal gucken, woran das jetzt liegen kann. Ist dann wohl doch irgend ne Einstellung. Die BDE hat bei mir hier als Datums-Zeichen ein "/" drinnen. Naja. Mal gucken... ;)
const
SELECT_STMT = 'SELECT * FROM AdrTest A WHERE A."_BackupTime" = :datzeit'; var datZeit: TDateTime; begin datZeit := StrToDate('12.12.2006') + StrToTime('22:54:06');; with Form1.Query1 do begin SQL.Text := SELECT_STMT; ParamCheck := True; Params.ParamByName('datzeit').AsDateTime:= datZeit; Open; end; end; Vllt. kriegt man das ja mit irgendwelchen Datums-Formatierungs-Routinen hin, oder? Also das man Tag, Monat, Jahr, Minute etc. übergibt und er dann den korrekten Wert ausgibt, oder? edit: Ist eigentlich schon bekannt, dass das Forum unter OS X ziemlich buggy ist? ;) Der schneidet mir einfach Text weg ;) |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Zitat:
Zitat:
|
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Zitat:
Nee, am Browser liegt's nicht ;) Zitat:
|
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Zitat:
|
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Zitat:
:idea: bzw 'Geistesblitz': LocalSQL ist ein bischen 'eigensinnig', was 'Sonderzeichen' (und dazu gehört der Unterstrich am Anfang) im Feldnamen angeht: diese MÜSSEN in doppelten Anführungszeichen gesetzt werden - wie du es ja auch insoweit richtig gemacht hast - NUR: es ist dann auch zwingend erforderlich, den Tabellennamen voran zu setzen:
Delphi-Quellcode:
So sollte es dann endlich auch mit dem Datum/Zeit-Parameter funktionieren...
const
SELECT_STMT = 'SELECT * FROM "Aufdate" WHERE AuftragNr = :auftrag AND "aufdate"."_BackupTime" = :datzei'; //-- bzw mithilfe eines TabellenAlias: SELECT_STMT = 'SELECT * FROM "Aufdate" A WHERE A.AuftragNr = :auftrag AND A."_BackupTime" = :datzei'; ... |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Also so langsam geb ich es auf, wenn ich in einem neuenProjekt folgendes ausprobiere, funktioniert alles :gruebel:
Delphi-Quellcode:
in dem Projekt, wo ich es eigentlich brauche funktioniert es nicht. Könnt ihr vielleicht mal gucken, ob ich irgendetwas übersehen habe? :gruebel:
var
datumzeit: tdatetime; begin datumzeit:= StrToDate('13.12.2006') + StrToTime('10:28:45'); with Query1 do begin Close; SQL.Text := 'SELECT * FROM testdatum WHERE dat = :datum'; ParamByName('datum').AsDateTime:= datumzeit; Open; end; end;
Delphi-Quellcode:
Ich versteh das nicht :wall:
const
SELECT_STMT = 'SELECT * FROM "[...]\Aufdate" WHERE AuftragNr = :auftrag AND "Aufdate"."_BackupTime" = :datzei'; Var datumzeit: TDateTime; begin datumzeit:= StrToDate(DBGdatum.SelectedField.AsString) + StrToTime(DBGZeit.SelectedField.AsString); with DBmodul.QcopyTable do begin Close; SQL.Text:= SELECT_STMT; ParamByName('auftrag').AsInteger := DBGrid1.SelectedField.AsInteger; ParamByName('datzei').AsDateTime:= datumzeit; Open; end; end; |
Re: Zeit/Datumswert mit einer Tabelle vergleichen
Aloha Simi,
setz mal den Debugger in Zeile 8 und schau dir mal an, was in den Werten überhaupt drin steht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 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