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