在数据库网格中显示MySql TIMEDIFF()

时间:2013-03-07 03:03:48

标签: mysql delphi anydac

当我使用命令行时,此查询给我带来令人满意的结果(它显示了持续时间,这是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

1 个答案:

答案 0 :(得分:2)

使用TField对象的DisplayFormat属性来获得所需的结果,例如:

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异常,因为您必须将其强制转换为它所属的正确类。