假设我有两个这样的表:
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及更高版本,这可能无法正常工作。 我是,而且只对第二准确性感兴趣。
如果有人能回答以下问题,将不胜感激:
修改
我知道我可以投出日期时间,感谢那些回答,但我正在尝试解决问题的根源(存储类型/定义已经更改的事实),我不想使用我的查询中的函数。这否定了我优化应用索引等的查询的所有工作,更不用说重写我的所有查询了。
EDIT2
那里的任何人都可以建议不使用第二准确度加入DATETIME
字段吗?
答案 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/