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


83

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

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


MySQLのどのバージョンですか?
ストロベリー

mysql Ver 14.14 Distrib 5.6.11、Win32(x86)
Luixv 2014年

運が良さそうです。
ストロベリー

挿入前のミリ秒単位の値が手元にありますか?もしそうなら、BIGINTとして直接保存してみませんか?
サンドマン

回答:


139

分数秒のデータ型で列を宣言するには、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)

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

(のようなMySQLの内部固定小数点演算は、* 0.001常にIEEE754倍精度浮動小数点として処理されるため、太陽が白色矮星になる前に精度が失われる可能性はほとんどありません。)

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

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


定義をtimestamp(6)に変更しましたが、この構文を使用して値を追加しようとすると、INSERT INTO確率(measured_at、probability、provider_id、segment_id)VALUES(1412877161519,0.7418073347680607,1,211623); 「measured_at」列にまだ0000-00-0000:00:00.00000が表示されます。このテーブルに値を挿入するにはどうすればよいですか?
luixv 2014年

1
@Luixv途中で値を変換する必要があります: INSERT ... VALUES(FROM_UNIXTIME(0.001 * 1412877161519), 0.7418 ... );
Michael --sqlbot 2014年

0.001を掛けると命の恩人です!2番目の分数を失うことなくそれが機能するとは想像もできませんでした。ありがとうございました。
Pavel S.

私の場合、私はラズベリーパイでのテストだ(と、本当にインストールするには、煩雑であるため、mysql 5.6RPIに、私はUnixの時間などの情報を保存したいと思います。
silgon

0

BIGINTは次のように使用できます。

CREATE TABLE user_reg (
user_id INT NOT NULL AUTO_INCREMENT,
identifier INT,
phone_number CHAR(11) NOT NULL,
verified TINYINT UNSIGNED NOT NULL,
reg_time BIGINT,
last_active_time BIGINT,
PRIMARY KEY (user_id),
INDEX (phone_number, user_id, identifier)
   );

ただし、BIGINTは8バイトです。これ以上効率的なものはありませんか?これは、レコードごとに必要以上に2バイト多いようなものです
S.Imp20年

0
CREATE TABLE fractest( c1 TIME(3), c2 DATETIME(3), c3 TIMESTAMP(3) );

INSERT INTO fractest VALUES
('17:51:04.777', '2018-09-08 17:51:04.777', '2018-09-08 17:51:04.777');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.