MySQL では、マイクロ秒 (6 桁) までの精度で、TIME
、DATETIME
および TIMESTAMP
値の小数秒がサポートされています:
-
小数秒部を含むカラムを定義するには、
の構文を使用します。ここで、type_name
(fsp
)type_name
はTIME
、DATETIME
、またはTIMESTAMP
であり、fsp
は小数秒の精度です。 例:CREATE TABLE t1 (t TIME(3), dt DATETIME(6));
fsp
値を指定する場合、0 から 6 の範囲にする必要があります。 0 の値は、小数部がないことを表します。 省略した場合、デフォルトの精度は 0 です。 (これは、以前の MySQL バージョンと互換性を保つため、標準 SQL のデフォルトである 6 とは異なっています。) -
小数秒の部分を含む
TIME
、DATE
またはTIMESTAMP
値を同じタイプのカラムに挿入すると、小数点以下の桁数が少なくなります。 次のように作成および移入されたテーブルについて考えてみます:CREATE TABLE fractest( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) ); INSERT INTO fractest VALUES ('17:51:04.777', '2018-09-08 17:51:04.777', '2018-09-08 17:51:04.777');
時間値は丸めでテーブルに挿入されます:
mysql> SELECT * FROM fractest; +-------------+------------------------+------------------------+ | c1 | c2 | c3 | +-------------+------------------------+------------------------+ | 17:51:04.78 | 2018-09-08 17:51:04.78 | 2018-09-08 17:51:04.78 | +-------------+------------------------+------------------------+
このような丸め行われたときに、警告やエラーは表示されません。 この動作は SQL 標準に従います。
かわりに切捨てを使用して値を挿入するには、
TIME_TRUNCATE_FRACTIONAL
SQL モードを有効にします:SET @@sql_mode = sys.list_add(@@sql_mode, 'TIME_TRUNCATE_FRACTIONAL');
この SQL モードを有効にすると、時間値は切捨てとともに挿入されます:
mysql> SELECT * FROM fractest; +-------------+------------------------+------------------------+ | c1 | c2 | c3 | +-------------+------------------------+------------------------+ | 17:51:04.77 | 2018-09-08 17:51:04.77 | 2018-09-08 17:51:04.77 | +-------------+------------------------+------------------------+
時間引数を取る関数は、小数秒を含む値を受け入れます。 時間関数からの戻り値には、必要に応じて小数秒が含まれます。 たとえば、引数を付けない
NOW()
は、小数部のない現在の日付と時間を返しますが、0 から 6 のオプション引数を取って、その桁数の小数秒部が戻り値に含まれていることを指定します。時間リテラルの構文は、
DATE '
、str
'TIME '
、およびstr
'TIMESTAMP '
の時間値と ODBC 構文同等の値を生み出します。 指定されている場合、結果の値には後続の小数秒部分が含まれます。 以前は、時間型キーワードは無視され、これらの構造は文字列値を生成していました。 標準 SQL と ODBC の日付および時間リテラルを参照してくださいstr
'