代码之家  ›  专栏  ›  技术社区  ›  ehdv

最好使用两列或日期时间

  •  0
  • ehdv  · 技术社区  · 17 年前

    我正在开发一个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 回复  |  直到 17 年前
        1
  •  6
  •   Sören Kuklau Keith Boynton    17 年前

    只使用 DATE() 功能。

    SELECT * FROM event_list WHERE DATE(startAt) = '2009-04-20'
    
        2
  •  6
  •   dkretz    17 年前

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

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

    使用两列有点像用列表示实数的整数和小数部分。如果你不需要时间,一开始就不要节省时间。

        3
  •  2
  •   lfx    17 年前

    你可以试试这样的SMF

    select * from event_list where date(startAt) = '2009-04-20
    
        4
  •  2
  •   tvanfosson    17 年前

    这两个世界中最好的一个怎么样——拥有一个使用单个日期时间列的表和一个同时提供日期和时间字段的表视图。

    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'
    
        5
  •  2
  •   Brent Baisley    17 年前

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

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

    这只是一个用于讨论目的的例子,显然您可以在event+startat上建立索引,它会起作用。但是,您可能会发现自己希望根据日期加上另一个字段进行搜索/汇总。在该数据上创建一个复合索引将使其非常有效。

        6
  •  0
  •   NickZoic    17 年前

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

    夏令时特别糟糕。

    (达米克)