日期应该存储为日期时间还是SQL中的int?

时间:2009-03-31 17:28:21

标签: php sql

我在datetime(0000-00-00 00:00:00)将我的所有日​​期存储在我的论坛中。 我看到phpBB,punBB和所有流行的论坛都在int中存储日期?

什么更好?

12 个答案:

答案 0 :(得分:23)

如果将日期存储为INT,则连接到数据库的每个应用程序或工具都必须知道如何将该INT转换为有意义的内容。我建议坚持使用适合数据的数据类型,除非您的特定RDBMS具有特定数据类型的严重缺陷。

要考虑的另一个问题是......如果将它们存储为INT,那么您也将无法访问许多特定于日期的函数,并且必须自己编写它们。例如,返回特定日期的日期名称(星期一,星期二等)。

答案 1 :(得分:4)

我不确定是否有“更好”的答案。但是我会推荐datetime,因为如果你把它们存储为int,你可能会遇到Year 2038 issue.

的问题

答案 2 :(得分:3)

我在所有时间字段中使用DATETIME(并且,使用MySQL,我总是避免使用TIMESTAMP)。但是,我使用的一个技巧是将列设置为NULL DEFAULT NULL。这样,对于我认为日期为空或空白的情况,我不需要担心或检查“0000-00-00 00:00:00”;我只检查IS NULL

我认为人们过去可能考虑过将INT用作日期列的唯一原因是因为有一次,DATETIME(以及DATE和TIME)在内部被MySQL实现为字符串。在这种情况下,DATETIME字段将比INT字段大得多,因此如果空间是一个问题,我可以看到做出的决定。这些天,情况已经不是这样了(我会说MySQL 4.x及以上),并且没有充分的理由不再选择DATETIME。

答案 3 :(得分:3)

此外,还有上述纪元日期的问题。在INT中保留会员出生日期之类的内容很困难,因为有些成员可能会在1970年1月1日之前出生。

答案 4 :(得分:2)

现在大多数DBMS都允许您针对实际日期时间字段进行更多时髦的查询。由于可用于日期操作和查询的功能很难证明使用整数。

我认为大多数BB系统都使用INT,因为它们更容易在多个数据库引擎中实现,如果你只关心日期部分,而不是时间部分你可能从INT获得略微更好的性能而不是到datetimes(通常是8字节浮点数)。

我个人更喜欢在datetime字段中存储日期,因为我几乎没有从一个数据库平台迁移到另一个数据库平台,例如,每个月的最后一个星期五要求数据库提供好处。

答案 5 :(得分:1)

最好的答案是“它取决于”。没有其他信息,我会说日期时间更好。我认为这些论坛的实现是对识别更好,更成熟的数据类型的失败。你必须想出一个非常好的理由,为什么你会想要更新日期。也许他们有,我只是不知道。

答案 6 :(得分:1)

一个日期时间,在内部,是一个int,一些纪元的秒数或毫秒数,通常是1970年1月1日午夜的linux纪元。

但它允许你使用各种精彩的日期函数来添加,减去和分解时间间隔,这是你无法用int做的(没有自己重写所有这些函数)。

所以你没有失去任何东西,并且通过使用日期/日期而不是int来获得很多其他人的答案。

答案 7 :(得分:0)

我使用数据仓库,将日期存储为例如int。 20090331格式。然后有一个表专用于将int转换为任何与日期相关的信息,包括日期时间表示。这提供了很大的灵活性,并允许我们添加额外的信息,如季度编号,假日指定等。如果您需要除整数日期之外的任何内容,只需加入日期表。

select MyTable.Stuff,DimDate.AsDateTime,DimDate.BusinessQuarter,DimDate.IsHoliday from MyTable
inner join DimDate on MyTable.DateKey = DimDate.DateKey

答案 8 :(得分:0)

SQL 2008引入了一个“日期”数据类型,小于完整的“日期时间”字段,如果你不需要时间部分(如果你正在考虑使用INT,那听起来就像你不是无论如何都需要。)

有关详细信息,请参阅this article

答案 9 :(得分:0)

我想跟进tpdi的答案并描述我多次尝试这种方式的经验。

当使用整数时,它已经完成了tpdi描述的约定 - 在1970年左右某个时间点的给定秒数。

当许多生产软件至少部分用C语言编写时,这种模式是(UNIX风格)标准,并为映射和日期计算提供了合理数量的函数。

上面没有讨论过的一个问题是,按小时,分钟和秒的插值并不是所有语言和DBMS库都能很好地处理的。基于整数的日期更好地处理这个问题而不用担心舍入错误 - 至少只要你不需要小于1秒的分辨率。不需要在0之前处理日期也是有帮助的,尽管可以在没有太多麻烦的情况下处理负整数。

最终的好处是,大多数语言/ DBMS都具有处理此约定的功能,这使得使用多种语言和DBMS产品更容易,兼容性问题更少。

在某些合理的情况下,它就像@tpdi desribes;但它也可以被打开 - 如果它们适合你的上下文,你可以通过处理整数日期时间的库来失去精度和跨语言兼容性。

答案 10 :(得分:0)

我会使用日期时间,除非other datestimes可以更好地存储为 int

答案 11 :(得分:-1)

仅供参考,如果您使用int / timestamp,那么您仍然可以获得RDBMS可以为日期/时间提供的所有功能。例如,在MySQL中,FROM_UNIXTIME(timestamp)采用整数时间戳并返回DATETIME,您可以随意使用它。

对于冗长的讨论,没有其他地方比Drupal项目的优秀人员更好:http://groups.drupal.org/node/731

希望这有帮助。