3

using Delphi 2010 (Firebird [testing], MS Sql Server, Oracle [production])

The following is my 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;

I am getting a "conversion error from string - 10-25-2012" and i am not sure why, since my datetime fields are in the "10/25/2012 9:20:49 AM" format in the database.

If i change it to the following : ParamByName('beginDateRange').AsString := formatDateTime('mm/dd/yyyy',Date - 30).....i get the error "conversion error from string - 10/25/2012"

reserching this error has provided me no new avenues, do you have any ideas?

4

4 に答える 4

5

Interbase 6.0のマニュアル、Embedded SQLガイドの第7章によると、FirebirdはYYYY-MM-DDおよびYYYY-MM-DD HH:MM:SS.qqqからの変換をサポートしています。また、変換のためにアメリカンスタイルの省略形の日付(たとえば、2012年1月1日)をサポートしていると思います。

ロケールに依存する変換がサポートされている可能性がありますが、一般的には、文字列の代わりに実際の日付/タイムスタンプタイプを使用します。

更新 私は最初にクエリでを見つけませんでしたTRUNC。この関数は数値に対してのみ機能するため、変換エラーの原因です。TRUNCの手動エントリを参照してください。

あなたのコメント(およびainの応答)を考えると、あなたは日付の部分だけに興味があり、時間を無視したいと思います。その場合は、の使用法を次のように書き直してくださいTRUNC

CAST(<your-timestamp-field> AS DATE)

そして条件(Trunc(p.start_time) >= :beginDateRange) AND (Trunc(p.start_time) <= :endDateRange)

CAST(p.start_time AS DATE) BETWEEN :beginDateRange AND :endDateRange
于 2012-10-26T10:28:17.537 に答える
2

文字列が12時間形式の場合、Firebirdは文字列から日付と時刻の値への変換をサポートしていません。'dd.mm.yyyy hh:mm:ss'または'mm / dd / yyyy hh:mm:ss'形式を使用します。

于 2012-10-25T15:44:22.323 に答える
0

文字列から日付/時刻への変換では、通常、ユーザーのロケールが使用されます。したがって、ロケールの日付部分と一致しない文字列を使用して日付/時刻変換関数をフィードすると、同様のエラーが発生します。

また、「10/25/2012」のような日付/時刻の値の指定はロケールに依存します。したがって、USロケール(Mineなど)とは異なるコンピューターでプログラムを実行する場合、「10/25/2012」を使用すると失敗する可能性があります。

ロケールに依存しないために、2つのオプションを提案します。

  • StrToDateTimeを使用して、 TFormatSettingsを指定します
  • 日付/時刻文字列の指定にはISO8601を使用します(ただし、Delphiはそれをサポートしていないと思います...)

MS Sql、ExcelなどのBTWプログラムは、ISO 8601の日付を受け入れます。ただし、FBについてはこれを確認する必要があります。

これに関して:

...データベースの日時フィールドが「2012/10/259:20:49AM」形式であるため...

日付/時刻フィールドの内部ストレージは、DBエンジンによって異なります。DB管理ソフトウェア(この場合は「10/25/20129:20:49 AM」)に表示されるのは、データフィールドの文字列表現であり、通常はユーザーのロケールに従って(再び)フォーマットされます。

于 2012-10-25T16:40:31.470 に答える
0

サーバーFirebird2.1でFirebird1.0からDBに接続した場合(たとえば)、Firebird2.1でバックアップと復元を行う必要があります。

于 2019-08-09T16:18:00.107 に答える