@kyanny's blog

My thoughts, my life. Views/opinions are my own.

PostgreSQL: timestamp 型の秒の小数点以下の桁数は0桁から6桁

8.5. 日付/時刻データ型

time、timestampおよびintervalは秒フィールドに保有されている小数点以下の桁数を指定する精度値pをオプションで受け付けます。 デフォルトでは、精度についての明示的な限界はありません。 pの許容範囲は0から6です。

Go でテストコードを書いていて、これに関連しそうなバグ?でハマった。

time.Time 型のデータを database/sql と lib/pq を使って PostgreSQL に INSERT し、その後 SELECT して構造体にマッピングしたものを reflect.DeepEqual で比較したり go-cmp の Diff で差分をとると、秒以下の桁数が異なっていて不一致となった(Go プログラム内で time.Now() で生成したものは9桁、 PostgreSQL から SELECT したものは6桁)

想像だが、 Go のレイヤーでは9桁(ナノ秒)の精度を持っているが PostgreSQL のレイヤーでは6桁(マイクロ秒)の精度しかなく、 PostgreSQL のレイヤーを一度通過することで6桁まで丸められてしまったのではないか。