1. ホーム
  2. mysql

[解決済み] ミリ秒精度のタイムスタンプ。MySQLで保存する方法

2023-01-17 13:57:23

質問

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 以降である必要があります。正しいバージョンであるかどうかわからない場合は 試してみてください。 SELECT NOW(3) . エラーが出る場合は、正しいバージョンでない可能性があります。

例えば DATETIME(3) はタイムスタンプにミリ秒の解像度を与えます。 TIMESTAMP(6) はマイクロ秒の分解能を持つ *nix スタイルのタイムスタンプを提供します。

これを読むと https://dev.mysql.com/doc/refman/8.0/en/fractional-seconds.html

NOW(3) は、MySQLサーバのオペレーティングシステムからミリ秒の精度で現在時刻を提供します。

からのミリ秒の数値がある場合、MySQL サーバはその時刻を表示します。 Unixエポック であれば、DATETIME(3) の値を取得するために次のようにしてみてください。

FROM_UNIXTIME(ms * 0.001)

Javascriptのタイムスタンプ からのミリ秒単位で表されます。 Unix エポック .

(MySQL内部で分数演算を行うことに注目し、例えば * 0.001 のような MySQL 内部の端数演算は常に IEEE754 倍精度浮動小数点として処理されるので、太陽が白色矮星になる前に精度が失われることはまずありません)。

古いバージョンの MySQL を使用していて、サブセカンドの時間精度が必要な場合、アップグレードするのが最善の方法です。 それ以外の方法では、厄介な回避策を講じることを余儀なくされるでしょう。

もし、何らかの理由でアップグレードできない場合は BIGINT または DOUBLE カラムを使用して、Javascript のタイムスタンプを数値のように格納することができます。 FROM_UNIXTIME(col * 0.001) でも問題なく動作します。もし、このようなカラムに現在時刻を格納する必要がある場合は UNIX_TIMESTAMP() * 1000