LoginSignup
1
0

More than 3 years have passed since last update.

ActiveRecordからMySQLにDateTime型のオブジェクト入れた時にマイクロ秒が000000になる理由

Last updated at Posted at 2019-07-21

MySQL5.6系からマイクロ秒に対応しているが、Railsからマイグレする時だとマイクロ秒のオプションを明示的に書かないとDateTime(0)でマイグレーションしてるみたいで値のマイクロ秒以下はすべて 000000 として永続化される。

DB側でマイクロ秒単位まで正しく永続化したい場合はマイグレーションする際に limit 句を渡してあげること。

# tests テーブルにカラム追加
t.datetime :hoged_at, limit: 6
t.datetime :fugaed_at

# SHOW CREATE TABLE tests;の結果
`hoged_at` datetime(6) DEFAULT NULL,
`fugaed_at` datetime DEFAULT NULL,

[1] pry(main)> t = Time.parse('2019-07-21 10:00:00.123456')
=> 2019-07-21 10:00:00 +0900
[2] pry(main)> Test.create(hoged_at: t, fugaed_at: t)
2019/07/21 10:34:43   Test Create (0.5ms)  INSERT INTO `tests` (`hoged_at`, `fugaed_at`, `created_at`, `updated_at`) VALUES ('2019-07-21 10:00:00.123456', '2019-07-21 10:00:00', '2019-07-21 10:34:43', '2019-07-21 10:34:43') /* host: 
=> #<Test:0x00007f7fc252dfe8
 id: 2,
 hoged_at: Sun, 21 Jul 2019 10:00:00 JST +09:00,
 fugaed_at: Sun, 21 Jul 2019 10:00:00 JST +09:00,
 created_at: Sun, 21 Jul 2019 10:34:43 JST +09:00,
 updated_at: Sun, 21 Jul 2019 10:34:43 JST +09:00>
[3] pry(main)> Test.find(2).hoged_at.usec
2019/07/21 10:35:03   Test Load (0.5ms)  SELECT  `tests`.* FROM `tests` WHERE `tests`.`id` = 2 LIMIT 1
=> 123456
[4] pry(main)> Test.find(2).fugaed_at.usec
2019/07/21 10:35:11   Test Load (0.5ms)  SELECT  `tests`.* FROM `tests` WHERE `tests`.`id` = 2 LIMIT 1
=> 0
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0