0

コマンド ラインを使用すると、次のクエリで満足のいく結果が得られます (TIMEDIFF の目的であるデュレーションが表示されます)。

mysql> select timediff(end_time_stamp,start_time_stamp) from test_runs;
+-------------------------------------------+
| timediff(end_time_stamp,start_time_stamp) |
+-------------------------------------------+
| 00:00:07                                  |
| 00:00:11                                  |
| 00:01:23                                  |
+-------------------------------------------+
3 rows in set (0.00 sec)

Delphi の DB グリッドに配置すると、TIMEDIFF は のようにフォーマットされますが12:00:07 AM、これは私が望むものではありません (期間ではなく時間のように見えます)。

AnyDacを使っていて、設計時にクエリエディタを開いて実行すると結果も12:00:07 AMになってしまうので、なぜかAnyDacが整形しているようです。

00:00:07 (時間ではなく期間) のような出力を取得するにはどうすればよいですか?

  • AnyDac クエリを微調整できますか?
  • MySql ステートメントを使用して出力を明示的にフォーマットできますか?
  • 再フォーマットするためにコーディングできる OnXXX() 関数はありますか (およびその方法)?

[更新] さて、この醜いコードは私が望むことを行いますが、もっとエレガントな方法はありますか?

SELECT run_id,
       start_time_stamp,
       end_time_stamp,
       CONCAT(CONCAT(CONCAT(CONCAT(LPAD(EXTRACT(HOUR FROM timediff(end_time_stamp,start_time_stamp)), 2, '0'), ":"),LPAD(EXTRACT(MINUTE FROM timediff(end_time_stamp,start_time_stamp)), 2, '0'), ":"), LPAD(EXTRACT(SECOND FROM timediff(end_time_stamp,start_time_stamp)), 2, '0'))) AS duration,
       description

FROM test_runs ORDER BY start_time_stamp DESC
4

1 に答える 1

2

オブジェクトのDisplayFormatプロパティを使用して、必要な結果を取得します。次に例を示します。TField

begin
  MyQuery.Open;
  MyQueryField.DisplayFormat := 'hh:nn:ss';
  //or casting a TField to a descendant, like this:
  (MyQuery.FieldByName('duration') as TDateTimeField).DisplayFormat := 'hh:nn:ss';
end;

編集

TDateTimeField にキャストを追加しました。実際のフィールドが TDateTimeField または子孫のインスタンスでない場合は、それが属する正しいクラスにキャストする必要があるため、EInvalidTypeCast 例外が発生します。

于 2013-03-07T03:11:00.897 に答える