【问题标题】:How best to store date/time in MySql?如何最好地在 MySql 中存储日期/时间?
【发布时间】:2012-11-20 08:25:22
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 取决于您是否打算存储时区
  • +1 个问题已更新。谢谢,@njzk2

标签: mysql delphi datetime


【解决方案1】:
  1. 我应该存储 Delphi TDateTIme,还是先转换为 Unix 时间戳?

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

    MySQL 有 five temporal types,其中只有两个同时存储日期和时间:DATETIMETIMESTAMP

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

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

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

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

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

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

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

    使用上述时间类型之一,您将能够完成所有这些操作(根据需要使用date functions)。 TIMESTAMPDATETIME 类型的默认输出是 'YYYY-MM-DD HH:MM:SS' 格式的字符串。

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

    SELECT TIMEDIFF(end, start) AS elapsed
    FROM   my_table
    WHERE  ...
    

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        我会使用 DATETIME。人类更容易阅读。

        【讨论】:

          【解决方案5】:

          您可以在MySQL Reference Manual, 11.3. Date and Time Types 中阅读有关 MySQL 日期和时间类型的所有信息,以及在 12.7. Date and Time Functions 中阅读有关函数的所有信息。

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

          更新基于 OP 的编辑问题:

          DateFormat() function 可以使用像 "%Y %m %d %k:%i:%s" 这样的格式字符串为您提供像“yyyy mm dd hh:mm:ss”这样的字符串。

          TimeDiff() function 会给你一个时间间隔类型,给出两个日期时间值之间的差异。

          【讨论】:

            【解决方案6】:

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

            MySQL Integer vs DateTime indexMySQL DATETIME vs TIMESTAMP vs INT performance and benchmarking with MyISAM

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

            注意以下事项:

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

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

            【讨论】:

              猜你喜欢
              • 2016-08-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-11-21
              • 1970-01-01
              • 2012-12-27
              • 1970-01-01
              • 2011-06-06
              相关资源
              最近更新 更多