我正在开发一个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%';
我不喜欢黑客行为或其对性能的潜在影响。
答案 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)