如何在MySql中最好地存储日期/时间?

时间:2012-11-20 08:25:23

标签: mysql delphi datetime

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

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

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

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

我很困惑,似乎无法在任何地方找到这个。任何有用的网址?

6 个答案:

答案 0 :(得分:9)

  1.   

    我应该存储Delphi TDateTIme,还是首先转换为Unix时间戳?

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

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

    正如其他人所提到的那样,差异在于你是否希望存储时区 - 尽管我发现看起来很混乱:

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

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

  2.   

    我应该如何在MySql中声明列?作为Double,或DateTime(如果我使用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  ...
    

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

我让MySQL按照自己的意愿处理日期/时间,即作为日期时间字段。它有很大的范围(不受时代限制)。

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

您可以在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会给你一个时间间隔类型,给出两个日期时间值之间的差异。

答案 5 :(得分:0)

有很多文章描述了在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'));
    使用 LOCAL TIME ZONE 进行对话

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