Wie vergleichen Firebird TimeStamp und Delphi DateTime?
Ich habe Folgendes Skript, das nie abrufen alle Daten, die seit TimeStamp-Datentyp in Firebird/Interbase ist nicht DateTime (*)
Wie soll ich es beheben ?? TX.
with DMApp.qryValidPeriod_ do
begin
Close;
SQL.Clear;
SQL.Add('select P.* from PERIOD P, FISCAL_YR F');
SQL.Add('where');
SQL.Add('P.FISCAL_YR_ID = F.FISCAL_YR_ID and');
SQL.Add('F.ENTITY_DB_ID = :PRIMARY_DB_ID and');
SQL.Add('F.FISCAL_YR_ID = :CURR_FY_ID and');
SQL.Add(':pTranDate BETWEEN P.BEG_PERIOD and P.END_PERIOD');
ParamByName('pTranDate').AsDateTime := sBATCH_DATE;
//BEG_PERIOD und END_PERIOD sind TimeStamp-Datentyp wie "2010-11-09 12:00'
//parameter return-Datentyp wie "2010-11-09'
(*) Ein Zeitstempel ist eine Spalte Datentyp verfügbar in Firebird/Interbase/SQL Server..., das hilft, um die Datenintegrität sicherzustellen. Zeitstempel werden automatisch jedes mal aktualisiert, wenn Sie eine Zeile mit einer timestamp-Spalte eingefügt oder aktualisiert wird. Werte in timestamp-Spalten sind nicht datetime-Daten, aber binary(8) varbinary(8) - Daten. Der timestamp-Datentyp hat keinen Bezug zu dem system Zeit, es ist einfach ein monoton steigender Zähler, deren Werte immer innerhalb einer Datenbank eindeutig sein (so dass es im Grunde eine eindeutige Zufallszahl.)
- Ist der TimeStamp in diesem Beispiel Ihre eigenen benutzerdefinierten Datentyp? Weil wir arbeiten sehr viel mit standart TIMESTAMP-Datentyp und es funktioniert gut, wenn im Vergleich zu query-Parametern.
- Nein, es ist nicht. Es ist Firebird 2.5. Wie oben gezeigt, die Tasche nie wieder irgendwelche Daten - (da der Wert des Parameters pTranDate ist der Datum-format, wie im debugger)
- Code sollte normalerweise funktionieren. Der Grund, warum die Abfrage gibt keine Ergebnisse vielleicht etwas anders. Überprüfen Sie Ihre anderen Parametern.
- Beispiel: Delphi-put '2010-11-09' als der Wert der pTranDate parameter. Mit diesem Wert das Skript keine Daten zurückgibt. Wenn ich buchstäblich ersetzen Sie diesen Parameterwert mit '2010-11-09 00:00', dann das script die Daten liefert.
- '2010-11-09' ist ein string-Wert, wie gehen Sie es an die parameter?
- '2010-11-09' ist ein string-Wert, wie gehen Sie es an die parameter? .. mit dem sql-editor kommt mit anydac. Nun alles eingerichtet ist, so dass mein Skript gibt Werte, wie es ist. Ich war mixing-Parameter zwischen den Datenbanken, die ich mit der Anydac multi-Datenbank-Verbindung. Vielen Dank für Ihre Hilfe. Sie hatten Recht, ich sollte überprüft haben, die Parameter zweimal.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht, dass Sie falsch verstanden TIMESTAMP-Datentypen in Firebird? In SQL92 TIMESTAMP ist ein standard-Datentyp zu halten, sowohl Datum und Uhrzeit-Werte. Es wird nicht automatisch aktualisiert und die Funktionen zurückgeben TIMESTAMP-Werte beziehen sich auf die Datenbank Zeit.
AFAIK, die Firebird-TIMESTAMP-Implementierung folgt die SQL-92-Regeln (http://www.firebirdsql.org/index.php?op=guide&id=ib6_newfeatures#datetime), und es sollte perfekt funktionieren mit Delphi .AsDateTime parameter.
SQL Server Zeitstempel, die wie von Ihnen beschrieben - und es sollte nie verwendet werden, im Vergleich mit Datum und Uhrzeit, "Der SQL Server-Datentyp timestamp hat nichts zu tun mit Zeit-und Datumsangaben" http://msdn.microsoft.com/en-us/library/ms191240(SQL.90).aspx
In der Regel, ich benutze es als string-parameter, da der Zeit Teil.
Idee ist, haben die Einstellungen unabhängig vom format, zum Beispiel "11-NOV-2010 12:32:25'
Zum Beispiel, könnten Sie versuchen,
Wo Sie haben ähnliche Funktionen wie diese
Beachten Sie, dass Sie auch etwas aus der Arbeit auf der server-Seite, die mit der Nutzung von sql-Extrakt
http://www.firebirdsql.org/refdocs/langrefupd20-extract.html
Einer UDF unten in Delphi geschrieben. Es wird drei Teile eines Datums und gibt den Datumswert in Firebird-format. Vielleicht wird Ihnen helfen, zu verstehen, wie konvertieren von Daten zwischen Delphi und FB.