Mysql 最好使用两列或DATETIME

Mysql 最好使用两列或DATETIME,mysql,database,Mysql,Database,我正在开发一个MySQL数据库,它将创建一个Today at列表并发送给订阅者。我想知道是在开始和结束字段上使用DATETIME数据类型更好,还是两个字段有两个列,startDate和startTime以及相应的数据类型更好。我的第一个想法是使用DATETIME,但这使得系统的后续使用有点尴尬,因为您无法再编写: SELECT * FROM event_list WHERE startAt='2009-04-20'; 相反,我发现最好的是: SELECT * FROM event_list W

我正在开发一个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%';
我不喜欢这种黑客行为,也不喜欢它对性能的潜在影响。

只需使用该功能即可

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

你可以试试这样的smf

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

这两个方面的优点是什么?有一个使用单个datetime列的表和一个同时提供日期和时间字段的表视图

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'

从事件列表中选择*,其中startAt>='2009-04-20'和startAt<'2009-04-21'

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


使用两列有点像为实数的整数和小数部分设置列。如果你不需要时间,就不要把它放在第一位。

还有一件事要补充:当心时区,如果你提供在线服务,它迟早会出现,而且很难追溯

夏令时尤其糟糕


DAMHIK

单独的日期和时间字段或1个日期时间字段之间的真正考虑因素是索引。您不想这样做: 从事件列表中选择*,其中datestartAt='2009-04-20' 在datetime字段上,因为它不使用索引。MySQL将把startAt数据转换成日期以便进行比较,这意味着它不能使用索引。 您要执行以下操作: 从事件列表中选择*从“2009-04-20 00:00:00”到“2009-04-20 23:59:59”之间开始

datetime字段的问题在于,您不能将其真正用作复合索引,因为该值是相当唯一的。例如,startAt+event上的复合索引不允许您搜索date+event,只允许搜索datetime+event。 但是,如果在日期和时间字段之间分割数据,则可以为startDate+事件编制索引,并对其进行高效搜索


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

在WHERE子句中使用函数可能使优化器不会在startAt上使用任何索引。在WHERE子句中使用函数可能使优化器不会在startAt上使用任何索引。同意。问题涉及性能,因此他们可能希望避免表扫描!问题是,我希望能够快速抓取今天的事件,但如果说这一个是4pmSo,那么您可以从事件列表中选择timestart,event_name,其中startAt>=?还有startAt?由startAt订购。。。那将为你提取时间!PS:在上面的查询中应该是AND。考虑到它所报道的所有事件都将在一个校园内发生,这应该不是问题