精度为毫秒的时间戳:如何将它们保存在MySQL中

我必须开发一个应用程序使用MySQL,我必须保存像“1412792828893”这些代表时间戳,但精度为毫秒的值。 也就是自1970年1月1日以来的毫秒数。 我宣布行作为timestamp但不幸的是这不起作用。 所有值都设置为0000-00-00 00:00:00

 CREATE TABLE IF NOT EXISTS `probability` ( `id` int(11) NOT NULL AUTO_INCREMENT, `segment_id` int(11) NOT NULL, `probability` float NOT NULL, `measured_at` timestamp NOT NULL, `provider_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ; 

该声明应该如何才能以这个精度保存时间戳值?

您需要在MySQL 5.6.4或更高版本中使用小数秒时间数据types来声明列。 不知道你有正确的版本? 尝试立即SELECT NOW(3) 。 如果你得到一个错误,你没有正确的版本。

例如, DATETIME(3)将为您提供毫秒分辨率的时间戳, TIMESTAMP(6)将以* nix样式的时间戳为您提供微秒分辨率。

阅读: http : //dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html

NOW(3)将以毫秒的精度从MySQL服务器的操作系统中为您提供当前时间。

如果自Unix纪元以来有几毫秒的时间,试试这个来得到一个DATETIME(3)的值

 FROM_UNIXTIME(ms * 0.001) 

例如, Javascript时间戳以Unix纪元以来的毫秒数表示。

(请注意,MySQL内部的小数运算,如* 0.001 ,总是作为IEEE754双精度浮点处理,因此在太阳变成白矮星之前,不太可能会失去精度。)

如果您使用的是旧版本的MySQL,并且您需要亚秒级的时间精度,那么您的最佳path是升级。 还有什么会迫使你做混乱的解决方法。

如果出于某种原因无法升级,则可以考虑使用BIGINTDOUBLE列来存储Javascript时间戳,就好像它们是数字一样。 FROM_UNIXTIME(col * 0.001)仍然可以正常工作。 如果您需要将当前时间存储在这样的列中,则可以使用UNIX_TIMESTAMP() * 1000