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

时间:2012-11-27 02:08:53

标签: 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)

[更新] 数据源的查询是

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

当我在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)

但DB网格中的相应列仍为空白。有人可以帮忙吗?感谢。


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

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


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

有话语,声音很粗糙,现在我必须为浪费你的时间而妥协。遗憾。

3 个答案:

答案 0 :(得分: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;

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

select run_id, start_time_stamp, end_time_stamp, description, 
  (end_time_stamp - start_time_stamp) as duration from test_runs;

答案 1 :(得分:3)

  

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

首先,不删除该字段编辑器中的所有条目

  

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

首先,删除该列编辑器中的所有条目

之后,你应该看到网格中开放数据集的所有列,因为你消除了列编辑器和字段编辑器的所有限制。

猜测你的网格/数据会发生什么,你没有为列FieldName设置duration属性,因此网格不知道要呈现什么。

答案 2 :(得分:2)

要使用DBgrid,您需要一个数据源,每个数据集应分配给相应的组件,并确保已建立连接。如果你没有得到网格中的任何东西,你需要检查你的数据集,如果只有日期差异列数据丢失,但标题显示查询中的字段名称,那么你可能会获得空数据.....即使你没有得到标题名称你需要检查你的查询.......