如何在数据库网格中显示TIMEDIFF(现在,然后)?

Maw*_*awg 4 delphi dbgrid tdbgrid

对不起,我是DbGrids的新手.

我应该使用查询的字段编辑器,并以某种方式添加一个捕获TIMEDIFF的新字段,然后将其添加为我的DbGrid中的列?

或者我可以/应该跳过字段编辑器并以某种方式将TIMEDIFFF声明为列吗?

对于这个表,我想要一个包含4列的DbGrid:开始时间,结束时间,持续时间,描述(run_id是主键并且不会显示).

我对如何将数据输入"持续时间"列感到难过......

mysql> describe  test_runs;
+------------------+-------------+------+-----+---------+----------------+
| Field            | Type        | Null | Key | Default | Extra          |
+------------------+-------------+------+-----+---------+----------------+
| run_id           | int(11)     | NO   | PRI | NULL    | auto_increment |
| start_time_stamp | timestamp   | YES  |     | NULL    |                |
| end_time_stamp   | timestamp   | YES  |     | NULL    |                |
| description      | varchar(64) | YES  |     | NULL    |                |
+------------------+-------------+------+-----+---------+----------------+
4 rows in set (0.37 sec)
Run Code Online (Sandbox Code Playgroud)

[更新]数据源的查询是

SELECT start_time_stamp,
       end_time_stamp,
       TIMEDIFF(end_time_stamp, start_time_stamp) as duration,
       description

FROM test_runs ORDER BY start_time_stamp DESC
Run Code Online (Sandbox Code Playgroud)

当我在MySql中手动执行它时,我明白了

mysql> select TIMEDIFF(end_time_stamp, start_time_stamp) as duration FROM
+----------+
| duration |
+----------+
| NULL     |
| 00:04:43 |
| 00:00:13 |
| 00:00:06 |
| 00:00:04 |
+----------+
5 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

但DB网格中的相应列保持空白.有人可以帮忙吗?谢谢.


[更新]我正在使用AnyDac,如果有帮助的话.当我使用AnYDac查询编辑器并执行它时,查询在MySql和Delphi IDE中生成所有字段,包括时差.

唯一的问题是我在运行时没有在DB网格中看到它.我在设计时双击数据库网格,列正确.该FielName属性设置为duration,由上面显示的查询重新调整.它在数据库中不存在,但是由查询计算; 这可能是某种程度上的问题?


[Aaaaaaaar !!!]有人试图"改进"我的代码并在运行时以编程方式设置查询的文本(因为SELECT * FROM test_runs),因此覆盖了我的设计时查询!!因为数据库表没有duration字段,所以没有显示在数据库网格.

话语已经发出,声音变得粗糙,现在我必须为浪费你的时间而妥协.抱歉.

Jas*_*son 7

我将在您的查询中创建一个计算字段,并将该字段添加到您的DbGrid.

所以,正如你所说,打开字段编辑器进行查询,右键单击并选择New Field(或按Ctrl-N).为新字段命名(例如持续时间),保持组件名称默认或重命名(如果需要).根据需要设置Type(在这种情况下最有可能是DateTime)并将Field Type设置为Calculated.

然后,在Query的OnCalcFields事件中,将该字段的值设置为所需的值.例如:

procedure TForm1.Query1CalcFields(DataSet: TDataSet);
begin
  Dataset.FieldByName('description').AsDateTime :=
     DataSet.FieldByName('end_time_stamp').AsDateTime - 
     DataSet.FieldByName('start_time_stamp').AsDateTime;
end;
Run Code Online (Sandbox Code Playgroud)

或者,您还可以在选择查询中将持续时间作为额外字段包含在内.不幸的是我在这里没有现成的MySQL访问权限,但它可能是这样的:

select run_id, start_time_stamp, end_time_stamp, description, 
  (end_time_stamp - start_time_stamp) as duration from test_runs;
Run Code Online (Sandbox Code Playgroud)