MySQL加入/比较DATETIME列(< 5.6.4和> 5.6.4)

时间:2012-06-21 05:34:10

标签: mysql datetime time-precision

假设我有两个这样的表:

Events
ID (PK int autoInc), Time (datetime), Caption (varchar)

Position
ID (PK int autoinc), Time (datetime), Easting (float), Northing (float)

例如,如果我使用Time字段作为我的加入条件,列出所有事件及其位置是否安全?即:

SELECT E.*,P.* FROM Events E JOIN Position P ON E.Time = P.Time

或者,甚至只是简单地比较日期时间值(考虑到参数化值可能包含小数秒部分 - MySQL一直接受的部分),例如。

SELECT E.* FROM Events E WHERE E.Time = @Time

我理解MySQL(版本5.6.4之前)只存储datetime字段WITHOUT毫秒。所以我认为这个查询功能正常。但是从版本5.6.4开始,我已经读过MySQL现在可以用datetime字段存储毫秒。

假设使用诸如NOW()之类的函数插入日期时间值,则截断毫秒(< 5.6.4),我假设允许上述查询起作用。但是,对于5.6.4及更高版本,这可能无法正常工作。 我是,而且只对第二准确性感兴趣。

如果有人能回答以下问题,将不胜感激:

  1. 总的来说,MySQL如何将日期时间字段相互比较(考虑一下) 以上查询)。
  2. 以上查询是否正常,是否在时间上使用了索引 字段? (MySQL< 5.6.4)
  3. 有没有办法排除毫秒?即插入和插入时 有条件的连接/选择等? (MySQL> 5.6.4)
  4. 上面的联接查询是否有效? (MySQL> 5.6.4)

  5. 修改

    我知道我可以投出日期时间,感谢那些回答,但我正在尝试解决问题的根源(存储类型/定义已经更改的事实),我不想使用我的查询中的函数。这否定了我优化应用索引等的查询的所有工作,更不用说重写我的所有查询了。

    EDIT2

    那里的任何人都可以建议不使用第二准确度加入DATETIME字段吗?

2 个答案:

答案 0 :(得分:4)

似乎MySQL开发人员不想破坏向后兼容性,所以要使用毫秒,你显然必须更改你的表,sql等才能使用这个功能:

http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_now

  

现在([FSP])

     

从MySQL 5.6.4开始,如果给出了fsp参数来指定a   小数秒精度从0到6,返回值包括a   小数秒的那一部分。在5.6.4之前,任何   参数被忽略。

http://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html

  

MySQL 5.6.4及更高版本扩展了对TIME的小数秒支持,   DATETIME和TIMESTAMP值,最大为微秒(6位数)   精度:

     

要定义包含小数秒部分的列,请使用   语法type_name(fsp),其中type_name是TIME,DATETIME或   TIMESTAMP和fsp是小数秒的精度。例如:

CREATE TABLE t1 (t TIME(3), dt DATETIME(6)); The fsp value, if given, must be in the range 0 to 6. A value of 0 signifies that there is no fractional part. If omitted, the default precision is 0. (This differs from the standard SQL default of 6, for compatibility with previous MySQL versions.)

答案 1 :(得分:1)

尝试此查询。对于问题3和4,这将工作正常。使用时间字段进行连接仍然不是一个好习惯

SELECT E.*,P.* FROM Events E JOIN Position P ON date(E.Time) = date(P.Time)

虽然我已经为您提供了解决方案,但您将被限制在不同的表中插入相同的时间。然后你将能够进行比较,但这很困难,因为同时你不能运行两个插入查询。所以你必须为此做一些菜单工作。如果您想阅读更多内容,请阅读本文。

http://billauer.co.il/blog/2009/03/mysql-datetime-epoch-unix-time/