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