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

Lui*_*ixv 71 mysql datetime timestamp milliseconds

我必须使用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`)
) ;
Run Code Online (Sandbox Code Playgroud)

为了能够以这种精度保存时间戳值,声明应该如何?

O. *_*nes 113

您需要使用MySQL 5.6.4或更高版本来声明具有小数秒时间数据类型的列.不确定你的版本是否合适?试试SELECT NOW(3).如果出现错误,则表明您的版本不正确.

例如,DATETIME(3)将在时间戳中为您提供毫秒级的分辨率,并TIMESTAMP(6)在*nix样式的时间戳上为您提供微秒分辨率.

阅读:https://dev.mysql.com/doc/refman/8.0/en/fractional-seconds.html

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

如果你有自Unix时代以来的毫秒数,试试这个以获得DATETIME(3)值

FROM_UNIXTIME(ms * 0.001)
Run Code Online (Sandbox Code Playgroud)

例如,Javascript时间戳Unix纪元以毫秒为单位表示.

(请注意,MySQL内部分数算术* 0.001总是处理为IEEE754双精度浮点数,因此在太阳变成白矮星之前,你不太可能失去精度.)

如果您使用的是旧版本的MySQL,并且需要亚秒级时间精度,那么最好的方法就是升级.任何其他事情都会迫使你做一些凌乱的解决方法.

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