2012-11-21 18 views
1

Delphi XE2和MySql。尋求TSQLTimeStamp的編碼示例

我的previous question導致建議我應該使用MySql的本機TIMESTAMP數據類型來存儲日期/時間。

Unfornately,我似乎無法找到任何編碼的例子,我越來越奇怪的結果。

對於這個表:

mysql> describe test_runs; 
+------------------+-------------+------+-----+---------------------+-------+ 
| Field   | Type  | Null | Key | Default    | Extra | 
+------------------+-------------+------+-----+---------------------+-------+ 
| start_time_stamp | timestamp | NO | PRI | 0000-00-00 00:00:00 |  | 
| end_time_stamp | timestamp | NO |  | 0000-00-00 00:00:00 |  | 
| description  | varchar(64) | NO |  | NULL    |  | 
+------------------+-------------+------+-----+---------------------+-------+ 
3 rows in set (0.02 sec) 

我woudl喜歡:

  • 聲明一個變量進我可以存儲SELECT CURRENT_TIMESTAMP的結果 - 它應該是什麼類型? TSQLTimeStamp
  • 在測試開始時插入一行start_time_stamp =變量高於
  • end_time_stamp =某些「NULL」值...「0000-00-00 00:00:00」?我可以直接使用它,還是需要聲明TSQLTimeStamp並將每個字段設置爲零? (似乎沒有成爲一個TSQLTimeStamp.Clear; - 這是一個結構,而不是一類
  • UPADTE的end_time_stamp當測試完成
  • calcuate測試時間

可以somene請點我在一個網址一些Delphi代碼,我可以研究,看看如何做這種事情?GINMF。

+1

MySQL沒有TSQLTimeStamp類型。 –

+5

您的模式有缺陷,請勿使用時間戳作爲主鍵... – whosrdaddy

+0

請仔細檢查xplain爲什麼?這是一個有效的問題,並有明確的答案,而且我無法通過搜索 – Mawg

回答

6

我不知道爲什麼要使用該TIMESTAMP以及爲什麼要檢索CURRENT_TIMESTAMP以便恢復它。

而且如前所述,它不使用時間戳字段作爲主鍵很好的建議。

所以我的建議是使用這個表模式

CREATE TABLE `test_runs` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `start_time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `end_time_stamp` timestamp NULL DEFAULT NULL, 
    `description` varchar(64) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

開始測試運行由

INSERT INTO test_runs (description) VALUES (:description); 
SELECT LAST_INSERT_ID() AS id; 

,並完成備案處理,你只需撥打

UPDATE test_runs SET end_time_stamp = CURRENT_TIMESTAMP WHERE id = :id 
+1

+1優秀的答案。 – kobik

4

只是聲明一個TSQLQuery(或您選擇的數據訪問層的正確組件),將其附加到一個有效的連接並填充它的SQL屬性如下:

select * from test_runs; 

雙擊查詢以啓動它的字段編輯器,並從該編輯器的上下文菜單中選擇添加所有字段

根據您用來訪問數據的數據訪問層和驅動程序,它將創建正確的字段類型。

一旦完成,如果您需要使用代碼中的值,通常您可以通過使用該字段的AsDateTime屬性來完成此操作,因此您只需使用簡單的TDateTime Delphi類型,並讓數據庫訪問層處理特定數據庫詳細信息來存儲該字段。

例如,如果您的查詢對象命名爲qTest和表字段命名爲start_time_stamp,與持久字段相關的德里變量將被命名爲qTeststart_time_stamp,所以你可以做這樣的事情:

var 
    StartTS: TDateTime; 
begin 
    qTest.Open; 
    StartTS := qTeststart_time_stamp.AsDateTime; 
    ShowMessage('start date is ' + DateTimeToStr(StartTS)); 
end; 

如果您使用的是dbExpress並且是新手,請參閱A Guide to Using dbExpress in Delphi database applications

+1

對基本研究方法的優秀描述。 +1 – alzaimar

+0

+1 @alzaimar,但 - 我需要能夠檢索值,而不是'TDateTime',但作爲反映MySql數據類型'TIMESTAMP'的東西你能確認那是'TSQLTimeStamp'嗎?原因是我需要1)在測試開始時獲取當前的MySql時間戳,並將其存儲在一個Delphi變量中,然後插入一個新的行開始和NUll /零結束(我該怎麼做)? 2)當測試結束時,我需要「更新test_runs SET end_time_stamp = <當前MySql時間> WHERE start_time_stamp = <先前存儲的變量>」。感謝您的幫助,但您的回答沒有解決這個 – Mawg

+1

@Mawg我的答案沒有解決這個問題,因爲這對我來說是新的。在按照我的問題的步驟完成後,Delphi爲您的專欄使用了哪個課程? – jachguate

1

我不瞭解MySQL,但如果生成的TField子類是TSQLTimeStampField,則需要使用u請參閱SqlTimSt單位(Data.SqlTimSt for XE2 +)中的類型和功能。

要聲明局部變量TSQLTimeStamp

uses Data.SQLTmSt....; 
.... 

var 
    StartTS: TSQLTimeStamp; 
    EndTS: TSQLTimeStamp; 
begin 
    StartTS := qTeststart_time_stamp.AsSQLTimeStamp; 

SQLTmSt還包括功能轉換和從TSQLTimeStamp,例如SQLTimeStampToDateTimeDateTimeToSQLTimeStamp

P.S.我傾向於同意使用時間戳作爲主鍵可能會導致問題。正如Rufo爵士所建議的那樣,我傾向於使用自動遞增代理鍵。