Fehler bei der Konvertierung von der Zeichenfolge, bei der Verwendung von Parametern in SQL
mit Delphi 2010 (Firebird [testing], MS Sql Server, Oracle [Produktion])
Das folgende ist meine SQL
SELECT p.script_no, MIN(p.start_Time) as startTime, MAX(p.end_Time) as endTime,
SUM(p.duration) as TotalDuration
FROM phase_times p
WHERE (p.script_no=:scriptNo) AND (Trunc(p.start_time) >= :beginDateRange) AND (Trunc(p.start_time) <= :endDateRange)
GROUP BY p.script_no
ParamByName('beginDateRange').AsDate:= Date - 30;
ParamByName('endDateRange').AsDate:= Date;
Ich bin immer ein "Fehler bei der Konvertierung von string - 10-25-2012" und ich bin nicht sicher, warum, da mein datetime-Felder sind in der "10/25/2012 9:20:49 BIN" - format in der Datenbank.
Wenn ich es folgendermaßen ändern : ParamByName('beginDateRange').AsString := formatDateTime('mm/dd/yyyy',Date - 30).....ich bekomme die Fehlermeldung "Fehler bei der Konvertierung von string - 10/25/2012"
reserching dieser Fehler hat mir keine neue Wege gehen, haben Sie irgendwelche Ideen?
Was ist der Datentyp des
beide begin-und end-Datum datetime-Felder
Firebird nicht über einen datetime-Datentyp.
start_Time
Feld? (VAR)CHAR-oder TIMESTAMP?beide begin-und end-Datum datetime-Felder
Firebird nicht über einen datetime-Datentyp.
InformationsquelleAutor Blow ThemUp | 2012-10-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach dem Interbase 6.0-Handbuch, Embedded SQL-Handbuch, Kapitel 7, Firebird unterstützt die Konvertierung von YYYY-MM-DD YYYY-MM-DD HH:MM:SS.qqq. Ich glaube auch, es unterstützt amerikanischen Stil-Kurzform-Termine (z.B. 1-JAN-2012) für die Konvertierung.
Kann es sein, es gibt einige locale-abhängigen Umwandlung unterstützt, aber im Allgemeinen gilt: verwenden Sie ein Datum/timestamp-Typ anstelle eines string.
UPDATE
Ich habe zunächst nicht vor Ort die
TRUNC
in der Abfrage: es ist die Ursache für den Fehler bei der Konvertierung, wie diese Funktion funktioniert nur mit zahlen, sehen die manuelle Eingabe für TRUNC.Gegeben, Ihr Kommentar (und die respons von ain), vermute ich, Sie sind nur daran interessiert, den Teil des Datums, und wollen, ignorieren die Zeit. Wenn ja, schreiben Sie Ihre Verwendung von
TRUNC
:Und der Zustand
(Trunc(p.start_time) >= :beginDateRange) AND (Trunc(p.start_time) <= :endDateRange)
:Ich denke, dann wird das problem durch das verwenden von
TRUNC
in der Abfrage, so dass nur konvertiert zahlen, keine Termine. Ich denke mal der Fehler könnte in der Tat über die Konvertierung inTRUNC
anstelle der parameter. Siehe firebirdsql.org/refdocs/langrefupd25-intfunc-trunc.htmlEs scheint tatsächlich so zu sein trunc, der das problem verursacht, also wie kann ich loswerden der trunc-Funktion und wählen Sie die Datensätze, die eine wahre start_date >=:beginDateRange und <=:endDateRange. Ich bin besorgt mit der Zeit Teil des Datums. Will ich wirklich das coorect Ergebnis, wenn ParamByName('beginDateRange').AsDate:= Date - 30; ParamByName('endDateRange').AsDate:= Datum; ---danke
Verwenden
CAST(field AS DATE)
stattTRUNC
um den Datumsteil des Zeitstempels.Ich habe meine Antwort aktualisiert
InformationsquelleAutor Mark Rotteveel
Firebird unterstützt keine Konvertierung von string zu Datum und Zeit Wert, wenn die Zeichenkette wird in 12-Stunden-format. Verwenden 'dd.mm.yyyy hh:mm:ss' oder 'mm/dd/yyyy hh:mm:ss' - Formate.
InformationsquelleAutor Andrej Kirejeŭ
String zu Datum - /Zeit-Konvertierungen in der Regel verwenden Sie den Benutzer-Gebietsschema.
Also, wenn Sie füttern eine Datum/Uhrzeit-Konvertierung Funktion mit einer Zeichenfolge, die nicht mit Ihren date-Teil der locale - Sie erhalten ähnliche Fehler.
Auch die Angabe von Datum/Zeit-Werte wie "10/25/2012" ist von der Locale abhängig. Also, wenn Sie führen Sie Ihr Programm auf einem Rechner, der mit anderer als der US-amerikanischen Gebietsschema (wie bei Mir) - es ist wahrscheinlich ein Fehler bei Verwendung von "10/25/2012".
Werden Gebietsschema unabhängige schlage ich vor, zwei Optionen:
BTW-Programme wie MS-Sql, Excel usw.. akzeptieren Datumsangaben in ISO 8601. Aber Sie haben zu prüfen, das für die FB.
Zu diesem:
Die interne Speicherung von Datums - /Uhrzeit-Felder variiert zwischen verschiedenen DB-Engines. Was sehen Sie in Ihrem DB-Management-Software ("10/25/2012 9:20:49 BIN" in deinem Fall) ist die string-Darstellung des Datenfeldes, die in der Regel formatiert (wieder) nach Ihrer Benutzer-Gebietsschema
AsDate
ist, lassen Sie den DB-Treiber Griff die notwendige Konvertierung mit eigenen nativen Format benötigt werden, so dass Sie nicht haben, um. WennAsDate
ist dabei eine schlechte Umwandlung von Strings, dann ist es entweder einTParam
bug, oder ein DB-Treiber Fehler.Benutze ich keine strings verwende ich DateTime-Felder, nicht für strings. ich habe das zweite Beispiel in meinem Beitrag zu zeigen, dass, wenn ich mein params zu AsString, bekomme ich den gleichen Fehler.
So kann Remy Lebeau, ist richtig - ist es vielleicht DB-Treiber bug? Welche Komponenten verwenden Sie für den Zugriff auf die Datenbank?
Auch nicht, dass das problem für alle drei DB-Motoren, die Sie verwenden oder einer von Ihnen?
InformationsquelleAutor iPath ツ