2012-11-20 35 views
3

我应该存储一个Delphi TDateTIme,或者先转换为Unix时间戳?或mayebeeven作为一个字符串?如何最好地在MySql中存储日期/时间?

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

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

顺便说一句,该计划将永远只用于一个tiemzone - 没有夏令时。

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

+3

取决于您是否打算存储时区 – njzk2

+0

+1问题已更新。谢谢,@ njzk2 – Mawg

回答

9
  1. 我应该存储德尔福TDateTime类型,或者转换为Unix时间戳第一?

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

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

    正如其他人所提到,差别归结到你是否希望存储时区 - 虽然我觉得看它相当混乱的方式:

    • TIMESTAMP使用会话的time_zone变量转换输入到UTC时间戳,然后再输出:这对于指定准确的时刻很有用;

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

  2. 我应该如何在MySQL声明列?作为双或DateTime(或整数,如果我使用Unix时间戳)?

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

    请注意TIMESTAMP还有其他功能,如automatic update,如果需要,您可能希望在列声明中禁用此功能。

  3. Whta是“正确的”,或者说是最简单的,如果我希望能够与显示字符串“月日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

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

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

4

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

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

1

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

我的经验,与MySQL和SQL Server,但不是与德尔本身,是你很好地存储日期和时间值的数据库的日期和时间格式。这使您可以使用数据库的日期和时间函数,并利用其优化的日期和时间功能实现。如果将日期时间值存储为Double或Unix整数时间戳等通用值,则缺少优化,必须实现自己的日期和时间函数。基于OP的编辑问题

更新

DateFormat() function可以给你的字符串,如 “月日HH:mm:ss的” 使用格式字符串像"%Y %m %d %k:%i:%s"

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

0

有一些职位的描述,保存日期时间的最佳方式在MySQL如

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

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

查找出以下几点:

  • 德尔福功能DateTimeToUnix(StrToDateTime('2013年11月22日16时34分45秒“));
    采用本地时区的谈话

  • MySQL的函数UNIX_TIMESTAMP( '2013年11月22日16时34分45秒') 采用GMT时区的谈话

相关问题