web-dev-qa-db-ja.com

ミリ秒精度のタイムスタンプ:それらをMySQLに保存する方法

MySQLを使用してアプリケーションを開発し、「1412792828893」のような値を保存する必要があります。この値は、タイムスタンプを表しますが、ミリ秒の精度を持ちます。つまり、1.1.1970からのミリ秒数。行を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`)
) ;

この精度でタイムスタンプ値を保存できるようにするには、どのように宣言する必要がありますか?

65
Luixv

小数秒時間データ型の列を宣言するには、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サーバーのオペレーティングシステムからミリ秒の精度で現在の時間を提供します。

nix Epoch 以降のミリ秒数がある場合は、DATETIME(3)値を取得するためにこれを試してください

FROM_UNIXTIME(ms * 0.001)

Javascriptタイムスタンプ は、たとえば nixエポック 以降のミリ秒単位で表されます。

* 0.001などのMySQL内部小数演算は常にIEEE754倍精度浮動小数点として処理されることに注意してください。そのため、太陽が白色d星になる前に精度が低下することはほとんどありません。)

古いバージョンのMySQLを使用していて、1秒未満の時間精度が必要な場合、最善の方法はアップグレードすることです。それ以外の場合は、面倒な回避策を実行する必要があります。

何らかの理由でアップグレードできない場合は、BIGINTまたはDOUBLE列を使用して、Javascriptのタイムスタンプを数字であるかのように保存することを検討できます。 FROM_UNIXTIME(col * 0.001)は引き続き正常に機能します。そのような列に格納するために現在の時間が必要な場合は、UNIX_TIMESTAMP() * 1000を使用できます

103
O. Jones