3

我应该存储一个 Delphi TDateTIme,还是先转换为 Unix 时间戳?或者 mayeb eeven 作为字符串?

我应该如何在 MySql 中声明该列?作为 Double 或 DateTime(如果我使用 Unix 时间戳,则为 Integer)?

Whta 是“正确的”,或者如果我希望能够显示带有“yyyy mm dd hh:mm:ss”(或类似)的字符串并且还能够通过比较两个值来获得经过的时间,那么什么是最简单的?

顺便说一句,该程序只会在一个 tiemzone 中使用 - 它没有夏令时。

我很困惑,似乎在任何地方都找不到这个讨论。有什么有用的网址吗?

4

6 回答 6

9
  1. 我应该存储一个 Delphi TDateTIme,还是先转换为 Unix 时间戳?

    通常,您都不应该这样做:数据库层中的数据类型应该(尽可能)本身有意义,而不是依赖于您的应用程序来解释它们。正如@Jim DeLaHunt 所说,这使数据库能够根据需要轻松地从 SQL 操作/解释它们(并且还使您将来能够轻松地从另一个应用程序代码库访问相同的数据)。

    MySQL 有五种时间类型,其中只有两种同时存储日期和时间:DATETIMETIMESTAMP.

    正如其他人所暗示的那样,不同之处在于您是否希望存储时区 - 尽管我发现这是一种非常令人困惑的看待它的方式:

    • TIMESTAMP使用会话的time_zone变量将输入转换为 UTC 时间戳,然后再返回输出:这对于指定准确的时间非常有用;

    • DATETIME简单地存储日期和时间而不考虑时区,就像拍摄日历和时钟的照片:它对于指定在全球同一本地时间发生的事件很有用。

  2. 我应该如何在 MySql 中声明该列?作为 Double 或 DateTime(如果我使用 Unix 时间戳,则为 Integer)?

    就像声明任何其他列一样,在列名之后指定相关数据类型。

    请注意TIMESTAMP具有附加功能,例如自动更新,如果需要,您可能希望在列声明中禁用这些功能。

  3. Whta 是“正确的”,或者如果我希望能够显示带有“yyyy mm dd hh:mm:ss”(或类似)的字符串并且还能够通过比较两个值来获得经过的时间,那么什么是最简单的?

    使用上述时间类型之一,您将能够完成所有这些(根据需要使用日期函数)。TIMESTAMP和类型的默认输出是格式DATETIME的字符串。'YYYY-MM-DD HH:MM:SS'

    特别是,比较两个值的“经过时间”可以通过 MySQL 的TIMEDIFF()函数获得:

    SELECT TIMEDIFF(end, start) AS elapsed
    FROM   my_table
    WHERE  ...
    
于 2012-11-20T08:38:39.387 回答
4

MySQL 应该有一种首选的本机日期格式,因为这允许人们使用 SQL 日期函数(年、月等)。

我在我的一个数据库表中有一个定义为 Delphi 日期时间的字段 - 回想起来这是一个错误,因为很难过滤该字段或显示值。这两种操作都需要在调用程序中进行特殊处理,而不是在数据库中进行处理。

于 2012-11-20T08:31:30.907 回答
2

我会让 MySQL 随心所欲地处理日期/时间,即作为日期时间字段。它的范围很广(不受时代限制)。

见这里:http ://dev.mysql.com/doc/refman/5.0/en/datetime.html

于 2012-11-20T08:31:07.190 回答
1

链接可能对您有用。这取决于您是否要使用时区,但即使您现在不需要它们,也要重新考虑将来是否无法使用它们。

我会使用日期时间。人类更容易阅读。

于 2012-11-20T08:29:32.960 回答
1

您可以在MySQL 参考手册11.3中阅读有关 MySQL 日期和时间类型的所有信息。日期和时间类型以及关于12.7 中的函数。日期和时间函数

我对 MySQL 和 SQL Server 的体验(虽然不是 Delphi 本身)是,您可以很好地以数据库的日期和时间格式存储日期和时间值。这使您可以使用数据库的日期和时间功能,并利用其优化的日期和时间功能实现。如果您将日期时间值存储为诸如 Double 或 Integer Unix 时间戳之类的通用值,您将缺乏优化,并且必须实现您自己的等效日期和时间函数。

根据 OP 的编辑问题进行更新:

DateFormat()函数可以使用格式字符串(如"%Y %m %d %k:%i:%s".

TimeDiff()函数将为您提供一个时间间隔类型,给出两个日期时间值之间的差异。

于 2012-11-20T08:33:02.907 回答
0

有许多帖子描述了在 mysql 中保存日期时间的最佳方法,例如

MySQL Integer vs DateTime 索引MySQL DATETIME vs TIMESTAMP vs INT 性能和 MyISAM 基准测试

如果您决定将日期时间转换为 Unix 时间戳并将其保存为整数

请注意以下事项:

  • Delphi 函数 DateTimeToUnix ( StrToDateTime('2013-11-22 16:34:45'));
    使用本地时区进行对话

  • MYSQL 函数 UNIX_TIMESTAMP ('2013-11-22 16:34:45') 使用GMT TIME ZONE进行对话

于 2013-11-22T15:55:29.097 回答