1

德尔福 XE2 和 MySql。

之前的问题导致建议我应该使用 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= 一些“NULL”值...“0000-00-00 00:00:00”?我可以直接使用它,还是需要声明 aTSQLTimeStamp并将每个字段设置为零?(似乎没有TSQLTimeStamp.Clear;- 它是一个结构,而不是一个类
  • 更新end_time_stamp测试完成的时间
  • 计算测试持续时间

有人可以请我指向一个带有一些 Delphi 代码的 URL,我可以研究它来了解如何做这种事情吗?国际货币基金组织。

4

3 回答 3

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
于 2012-11-21T09:21:00.210 回答
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 并且是新手,请阅读在 Delphi 数据库应用程序中使用 dbExpress 的指南

于 2012-11-21T07:30:20.190 回答
1

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

您想将局部变量声明为 TSQLTimeStamp

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

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

SQLTmSt 还包括与 TSQLTimeStamp 相互转换的函数,例如SQLTimeStampToDateTimeDateTimeToSQLTimeStamp

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

于 2012-11-21T10:22:16.423 回答