最好使用两列或DATETIME

时间:2009-04-18 20:18:33

标签: mysql database

我正在开发一个MySQL数据库,它将创建一个“Today at”列表并将其发送给订阅者。我想知道在开始和结束字段上使用DATETIME数据类型是否更好,或者两个有两列,startDate和startTime(具有适当的数据类型)。我的第一个想法是使用DATETIME,但这使得后续使用系统有点尴尬,因为你不能再写了:

SELECT * FROM event_list WHERE startAt='2009-04-20';

相反,我找到的最好的是:

SELECT * FROM event_list WHERE startAt LIKE '2009-04-20%';

我不喜欢黑客行为或其对性能的潜在影响。

6 个答案:

答案 0 :(得分:6)

只需使用DATE()功能。

SELECT * FROM event_list WHERE DATE(startAt) = '2009-04-20'

答案 1 :(得分:6)

SELECT * FROM event_list WHERE startAt> ='2009-04-20'AND startAt< '2009-04-21'

这将有效地使用startAt上的索引并正确处理边界条件。 (包含函数的任何WHERE子句都不能使用索引 - 它无法知道表达式结果与列值具有相同的顺序。

使用两列有点像实数的整数和小数部分的列。如果您不需要时间,请不要将其保存在首位。

答案 2 :(得分:2)

你可以尝试这样的smf

select * from event_list where date(startAt) = '2009-04-20

答案 3 :(得分:2)

两个世界中最好的 - 有一个使用单个日期时间列的表和该表的视图,它为您提供日期和时间字段。

create view vw_event_list
   as select ..., date(startAt) as startDate, time(startAt) as startTime

select * from vw_event_list where startDate = '2009-04-20'

答案 4 :(得分:2)

单独的日期和时间字段或1个日期时间字段之间的实际考虑是索引。你不想这样做: 从event_list中选择*,其中date(startAt)='2009-04-20' 在datetime字段上,因为它不会使用索引。 MySQL会将startAt数据转换为日期以便进行比较,这意味着它无法使用索引。 你想这样做: 从event_list中选择*,其中startAt BETWEEN'2009-04-20 00:00:00'和'2009-04-20 23:59:59'

日期时间字段的问题在于您无法真正将其用作复合索引,因为该值非常独特。例如,startAt +事件的复合索引不允许您搜索date + event,只搜索datetime +事件。 但是如果你在日期和时间字段之间拆分数据,你可以索引startDate + event并有效地搜索它。

这只是一个用于讨论目的的示例,您显然可以在事件+ startAt上编制索引,它可以正常工作。但您可能会发现自己想要根据日期和其他字段进行搜索/汇总。在该数据上创建复合索引将使其非常有效。

答案 5 :(得分:0)

还要补充一点:小心时区,如果你提供在线服务,它迟早会出现,而且追溯性很难做到。

夏令时特别糟糕。

(DAMHIK)