您建议使用datetime或timestamp字段吗?为什么(使用MySQL)?
我在服务器端使用PHP。
您建议使用datetime或timestamp字段吗?为什么(使用MySQL)?
我在服务器端使用PHP。
当前回答
我更喜欢使用时间戳,以便将所有内容保持在一个通用的原始格式中,并将数据格式化为PHP代码或SQL查询。在某些情况下,它可以在代码中方便地将所有内容保持在简单的秒数内。
其他回答
我更喜欢使用时间戳,以便将所有内容保持在一个通用的原始格式中,并将数据格式化为PHP代码或SQL查询。在某些情况下,它可以在代码中方便地将所有内容保持在简单的秒数内。
参考本条:
主要区别:
TIMESTAMP用于跟踪记录的更改,并在每次更改记录时进行更新。DATETIME用于存储不受记录更改影响的特定静态值。
TIMESTAMP也受不同时区相关设置的影响。DATETIME是常量。
TIMESTAMP在内部将当前时区转换为UTC进行存储,并在检索期间转换回当前时区。DATETIME无法执行此操作。
TIMESTAMP支持的范围:1970-01-01 00:00:01 UTC至2038-01-19 03:14:07 UTCDATETIME支持的范围:“1000-01-01 00:00:00”至“9999-12-31 23:59:59”
我是基于语义做出这个决定的。
当我需要记录(或多或少)固定时间点时,我使用时间戳。例如,当记录被插入到数据库中时,或者当发生某些用户操作时。
当可以任意设置和更改日期/时间时,我使用datetime字段。例如,当用户可以保存以后的更改约会时。
时间戳数据类型存储日期和时间,但使用UTC格式,而不是像datetime那样使用当前时区格式。当您获取数据时,时间戳再次将其转换为当前时区时间。
所以假设你在美国,从一个时区为美国的服务器获取数据,然后你将根据美国时区获取日期和时间。时间戳数据类型列总是在其行更新时自动更新。因此,跟踪上次更新特定行的时间可能很有用。
有关更多详细信息,您可以阅读博客文章Timestamp Vs Datetime。
我建议不要使用DATETIME或TIMESTAMP字段。如果你想将一个特定的日子作为一个整体来表示(比如生日),那么就使用DATE类型,但是如果你要更具体一些,你可能会对记录一个实际的时刻感兴趣,而不是一个时间单位(日、周、月、年)。不要使用DATETIME或TIMESTAMP,而是使用BIGINT,只需存储自epoch以来的毫秒数(如果使用Java,则为System.currentTimeMillis())。这有几个优点:
避免供应商锁定。几乎每个数据库都以相对类似的方式支持整数。假设您想移动到另一个数据库。您想担心MySQL的DATETIME值之间的差异以及Oracle如何定义它们吗?即使在不同版本的MySQL中,TIMESTAMPS也具有不同的精度级别。直到最近,MySQL才支持时间戳中的毫秒。没有时区问题。这里有一些关于不同数据类型的时区的见解。但这是常识吗?你的同事会花时间学习吗?另一方面,很难将BigINT更改为java.util.Date。使用BigINT会导致很多时区问题被搁置一旁。无需担心范围或精度。你不必担心未来日期范围会缩短什么(TIMESTAMP只适用于2038年)。第三方工具集成。通过使用整数,第三方工具(例如EclipseLink)与数据库的接口很简单。并非所有第三方工具都会像MySQL一样理解“datetime”。如果您使用这些自定义数据类型,想尝试在Hibernate中确定是否应该使用java.sql.TimeStamp或java.util.Date对象?使用基本数据类型使第三方工具的使用变得微不足道。
这个问题与如何在数据库中存储货币值(即1.99美元)密切相关。你应该使用十进制,还是数据库的货币类型,或者最糟糕的是双精度?由于上面列出的许多相同原因,所有三种选择都很糟糕。解决方案是使用BIGINT将货币的价值存储为美分,然后在向用户显示价值时将美分转换为美元。数据库的工作是存储数据,而不是插入数据。您在数据库(尤其是Oracle)中看到的所有这些花哨的数据类型几乎没有增加任何内容,并使您开始进入供应商锁定状态。