我在datetime(0000-00-00 00:00:00)将我的所有日期存储在我的论坛中。 我看到phpBB,punBB和所有流行的论坛都在int中存储日期?
什么更好?
答案 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 dates和times可以更好地存储为 int 。
答案 11 :(得分:-1)
仅供参考,如果您使用int / timestamp,那么您仍然可以获得RDBMS可以为日期/时间提供的所有功能。例如,在MySQL中,FROM_UNIXTIME(timestamp)
采用整数时间戳并返回DATETIME
,您可以随意使用它。
对于冗长的讨论,没有其他地方比Drupal项目的优秀人员更好:http://groups.drupal.org/node/731
希望这有帮助。