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

Sim*_*mon 8 mysql datetime time-precision

假设我有两个这样的表:

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

Position
ID (PK int autoinc), Time (datetime), Easting (float), Northing (float)
Run Code Online (Sandbox Code Playgroud)

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

SELECT E.*,P.* FROM Events E JOIN Position P ON E.Time = P.Time
Run Code Online (Sandbox Code Playgroud)

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

SELECT E.* FROM Events E WHERE E.Time = @Time
Run Code Online (Sandbox Code Playgroud)

我理解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)

编辑

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

EDIT2

任何人都可以建议不DATETIME使用第二准确度加入某个领域的原因吗?

biz*_*lop 5

似乎 MySQL 开发人员不想破坏向后兼容性,因此要使用毫秒,您必须明确更改表、sql 等才能使用此功能:

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

现在([fsp])

从 MySQL 5.6.4 开始,如果给出 fsp 参数以指定从 0 到 6 的小数秒精度,则返回值包括该多个数字的小数秒部分。在 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.)
Run Code Online (Sandbox Code Playgroud)