2012-11-27 23 views
4

对不起,我对DbGrids很新。如何在数据库网格中显示TIMEDIFF(现在,然后)?

我应该使用查询的字段编辑器,并以某种方式添加捕获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,该值由上面显示的查询重新调整。它不存在于数据库中,但是由查询计算;可以以某种方式成为问题?


[Aaaaaaaargh !!!]有人试图“改善”我的代码,并在运行时编程设置查询的文本(如SELECT * FROM test_runs),从而覆盖了我的设计时间查询!由于DATABSE表没有一个duration现场,没有表现出在数据库网格中。

话了,声音被rasied现在我必须apolgize浪费你的时间。对不起。

+1

我使用XE3和UniDAC测试了您的查询,并按预期运行。所有列和行都按预期显示。请添加您正在使用的Delphi版本和db-access-components。 –

+1

我想要投票这个问题的重复:http://stackoverflow.com/questions/15262319/displaying-a-mysql-timediff-in-a-db-grid,但我不能因为这有一个开放的赏金,但我真的没有得到两个问题的区别! – jachguate

回答

7

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

因此,正如您所说的那样,在为查询打开字段编辑器的情况下,右键单击并选择New Field(或按Ctrl-N)。为您的新字段命名(例如持续时间),如果您愿意,请将组件名称保留或重命名。根据需要设置类型(本例中最有可能的日期时间)并将字段类型设置为已计算。

然后,在查询的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; 
2

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

3

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

起先没有,从字段编辑器

,或者可以/我应该跳过字段编辑器并以某种方式宣布 TIMEDIFFF作为列删除所有条目?

在第一

不,从该列编辑器删除所有条目的

之后,你会看到所有列从电网里面打开的数据集,因为你消除所有的列编辑和字段编辑器的局限性。

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

+1

+1删除确实显示了所有列,但没有显示'持续时间',因为这在数据库中不存在,并且由查询计算。当我将它们添加回来时,对象检查器正确地提供了FieldName属性中查询返回的字段,包括'duration'。但它不会在网格中显示“duration”(显示所有其他字段)。这是否因为'持续时间'是由查询计算的? – Mawg

相关问题