2013-08-21 99 views
15

我通常使用datetime字段来存储应用程序中数据的created_time更新时间。日期时间vs日期和时间Mysql

但现在我遇到了一个数据库表,他们在表中保留了日期和时间分隔的字段。

  1. 那么,其中两个应该使用的模式是什么?为什么?
  2. 使用两者有什么优点和缺点?
+1

我正在考虑切换到单独的日期和时间字段。我的情况是,当我知道日期时,我需要能够存储'待定'时间。目前我使用12AM作为'TBD'时间的价值,但事实证明比我想要的更麻烦。有没有人遇到过TBD时间的更好解决方案?或者让我的方法工作者对他们更好? –

回答

23

我倾向于认为将日期和时间存储在单独的字段中基本没有优势。 MySQL提供了非常方便的功能,用于提取值的日期和时间部分。

好的。可能有一些效率原因。在MySQL中,您可以在这些字段中放置单独的索引。因此,例如,如果您想要搜索特定的时间,那么按一天中的小时计数的查询(例如)可以使用time字段上的索引。在这种情况下,不会使用datetime字段的索引。单独的date字段可能会更容易编写将使用date索引的查询,但严格来说,datetime也应起作用。

有一次我看到日期和时间单独存储在交易系统中。在这种情况下,交易有估价日期。估值时间类似于“纽约公开赛”或“伦敦关闭” - 这不是实时价值。它描述了用于评估的时间。

1

棘手的部分是,当你必须对时间值进行日期算术,并且你不希望日期部分进入混合。例:

myapptdate = 2014年1月2日9时00分00秒

选择如此这般其中myapptdate 2014年1月2日7时00分00秒和2014年1月2日13:00:00之间

1900年1月2日07:00:00 2014年1月2日07:00:00

25

使用上述DATETIME场DATE字段时,在性能上的巨大差异。我有一个包含更多4.000.000记录的表格,并且为了测试目的,我添加了两个包含它们自己的索引的字段。一种使用DATETIME,另一种使用DATE。

我禁用MySQL查询缓存,能够正确地测试和环绕在同一查询1000X:

SELECT * FROM `logs` WHERE `dt` BETWEEN '2015-04-01' AND '2015-05-01' LIMIT 10000,10; DATETIME INDEX: 197.564秒。

SELECT * FROM `logs` WHERE `d` BETWEEN '2015-04-01' AND '2015-05-01' LIMIT 10000,10; 日期指数: 107.577秒。

使用日期索引字段的性能改进为:45.55%!!

所以我会说,如果你期望在你的表中有很多数据,请考虑用自己的索引与时间分离日期。