2012-11-27 42 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

相關問題