正在寻找TSQLTimeStamp的编码示例

时间:2012-11-21 06:56:59

标签: mysql delphi timestamp

Delphi XE2和MySql。

我的previous question建议我应该使用MySql的本地TIMESTAMP数据类型来存储日期/时间。

不幸的是,我似乎无法找到任何编码示例,而且我得到了奇怪的结果。

鉴于此表:

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)

我喜欢:

  • 声明一个变量,我可以在其中存储SELECT CURRENT_TIMESTAMP的结果 - 它应该是什么类型的? TSQLTimeStamp
  • 在测试开始时插入一行,其中start_time_stamp =上面的变量
  • end_time_stamp = some" NULL"价值..." 0000-00-00 00:00:00"?我可以直接使用它,还是需要声明TSQLTimeStamp并将每个字段设置为零? (它似乎不是TSQLTimeStamp.Clear; - 它是一个结构,而不是一个类
  • 在测试完成时更新end_time_stamp
  • 计算测试持续时间

请问有人请点我一个带有一些Delphi代码的URL,我可以研究一下,看看如何做这类事情? GINMF。

3 个答案:

答案 0 :(得分:6)

我不知道为什么你想要使用TIMESTAMP来解决问题,以及为什么要检索CURRENT_TIMESTAMP只是为了把它放回去。

如前所述,将TIMESTAMP字段用作PRIMARY KEY并不是一个好建议。

所以我的建议是使用这个TABLE SCHEMA

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 :(得分:4)

只声明一个TSQLQuery(或您选择的数据访问层的正确组件),将其附加到有效连接并用以下内容填充它的SQL属性:

select * from test_runs;

双击查询以启动它的字段编辑器,然后从该编辑器的上下文菜单中选择添加所有字段

根据您用来访问数据的数据访问层和驱动程序,它将创建正确的字段类型。

完成后,如果需要在代码中使用该值,通常使用该字段的AsDateTime属性来执行此操作,因此您只需使用普通的TDateTime Delphi类型并让数据库访问层处理使用特定的数据库详细信息来存储该字段。

例如,如果您的查询对象名为qTest且表字段名为start_time_stamp,则与该持久字段关联的Delhi变量将命名为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

答案 2 :(得分:1)

我不了解MySQL,但如果生成的TField子类是TSQLTimeStampField,则需要使用SqlTimSt单元中的类型和函数(DataSqlTimSt for XE2 +)。

您希望将局部变量声明为TSQLTimeStamp

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

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

SQLTmSt还包括与TSQLTimeStamp进行转换的函数,例如: SQLTimeStampToDateTimeDateTimeToSQLTimeStamp

P.S。我倾向于同意使用时间戳作为主键可能会导致问题。正如Rufo爵士建议的那样,我倾向于使用自动递增的代理键。