8

假设我有两个这样的表:

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

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

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

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 版之前)只存储没有毫秒的日期时间字段。所以我会假设这个查询可以正常工作。但是,从 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)

编辑

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

编辑2

DATETIME那里的任何人都可以提出不使用第二精度加入某个领域的理由吗?

4

2 回答 2

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.)
于 2012-06-21T07:33:28.880 回答
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/

于 2012-06-21T06:22:50.477 回答