2014-10-10 318 views
37

我必須開發一個使用MySQL的應用程序,我必須保存像「1412792828893」這樣的代表時間戳但精度爲毫秒的值。也就是自1970年1月1日以來的毫秒數。我宣佈該行爲timestamp,但不幸的是這不起作用。所有的值設置爲0000-00-00 00:00:00毫秒級精度的時間戳:如何將它們保存在MySQL中

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`) 
) ; 

如何應該聲明,以能夠保存時間戳值由該精度?

+0

什麼版本的MySQL? – Strawberry 2014-10-10 12:16:51

+0

mysql Ver 14.14 Distrib 5.6.11,用於Win32(x86) – Luixv 2014-10-10 12:20:43

+0

看起來你很幸運。 – Strawberry 2014-10-10 12:33:29

回答

62

您需要在MySQL 5.6.4或更高版本中使用小數秒時間數據類型聲明列。不知道你有正確的版本?嘗試SELECT NOW(3)。如果你得到一個錯誤,你沒有正確的版本。

例如,DATETIME(3)將爲您提供毫秒分辨率的時間戳,TIMESTAMP(6)將爲您提供* nix樣式時間戳的微秒分辨率。

閱讀:http://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html

NOW(3)會給你從你的MySQL服務器的操作系統精確到毫秒當前時間。

如果你有自Unix epoch毫秒數,試試這個得到DATETIME(3)價值

FROM_UNIXTIME(ms * 0.001) 

Javascript timestamps,例如,由於Unix epoch毫秒錶示。

(注意,MySQL的內部小數運算,如* 0.001,總是爲IEEE754雙精度浮點處理的,因此它不太可能的太陽變成一顆白矮星之前,你將失去精度。)

如果」重新使用舊版本的MySQL,並且您需要亞秒級時間精度,您的最佳路徑是升級。其他任何事情都會迫使你做混亂的解決方法。

如果出於某種原因無法升級,則可以考慮使用BIGINTDOUBLE列來存儲Javascript時間戳,就好像它們是數字一樣。 FROM_UNIXTIME(col * 0.001)仍然可以正常工作。如果您需要將當前時間存儲在這樣的列中,則可以使用UNIX_TIMESTAMP() * 1000

+0

我已將定義更改爲時間戳(6),但嘗試使用此語法添加值時INSERT INTO概率(measured_at,probability,provider_id,segment_id)VALUES(1412877161519,0.7418073347680607,1,211623); 我仍然在「measured_at」列中獲得了00:00:00:00。我應該如何將值插入到這張表中? – Luixv 2014-10-10 14:46:28

+1

@Luixv你需要將值轉換爲:'INSERT ... VALUES(FROM_UNIXTIME(0.001 * 1412877161519),0.7418 ...);' – 2014-10-11 00:19:12

+0

乘以0.001是一個救星!我永遠不會猜測它會工作而不會失去第二部分。謝謝。 – 2015-01-10 21:01:31