MySQLの時間進位問題について簡単に分析する。


MySQLではデフォルトの時間型(datetimeとtimestamp)の精度は秒であり、設定した時間値の精度が秒より小さいと四捨五入され、データベースの値が元の値より一秒多くなる可能性があります。つまり、今日の記録は明日まで記録されるかもしれません。
以下は一例で、時間の進数を示しています。まずテーブルを作成します。

CREATE TABLE test_time (
 time_sec   datetime,
 time_millis datetime(3),
 time_micros datetime(6),
 stamp_sec  timestamp,
 stamp_millis timestamp(3),
 stamp_micros timestamp(6)
);
ある読者はdatetimeとtimestampの定義を知らないかもしれません。精度値は0~6で、数桁の小数を残して、デフォルト値は0です。3ビットの保持は精度がミリ秒と考えられ、6ビットの保持は精度がマイクロ秒と考えられます。
そして私たちはレコードを挿入します。

INSERT INTO test_time
( time_sec, time_millis, time_micros, 
 stamp_sec, stamp_millis, stamp_micros )
VALUES(
 '2019-11-30 12:34:56.987654', 
 '2019-11-30 12:34:56.987654', 
 '2019-11-30 12:34:56.987654',
 '2019-11-30 12:34:56.987654', 
 '2019-11-30 12:34:56.987654', 
 '2019-11-30 12:34:56.987654'
);
次にもう一度調べたら次の結果が見えます。
time_sec             |time_milis            |time_micros               |stamp_sec            |stamp_milis           |stamp_micros              |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
2019-11-30 12:34:57.0|2019-11-30 12:34:56.88|2019-11-30 12:34:56.87654|2019-11-30 12:34:57.0|2019-11-30
タイムが見えますsecとstamp_secはデータベースの中の秒値が全部進位されました。time_milisとstamp_ミリスのミリ秒値は進数されました。
このような誤差を避けるためには、2つの手段があることが分かる。
  • フィールドを定義するときは、datetime(6)またはtimestamp(6)を使用する。
  • フィールドを定義するときは精度がありませんが、時間をデータベースに保存する前にミリ秒値を切り取ります。
  • 関連文書:
    MySQL 5.6 Reference:Fractional Seconds in Time Values
    締め括りをつける
    以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。