Postgres関数extract()
がdate
値からdouble precision
を返すのはなぜですか?
私が想像できる唯一の理由は、カレンダーを使用するいくつかのロケール(グレゴリオ暦ではなく、Postgresでサポートされているもの)があり、日付/時刻を異なる方法で計算し、可能な浮動小数点数を返すことです。
これは、戻り値が大きくなるか、10進数になる可能性があるためです。
倍精度は広範囲の値を受け入れます
他の数値型を見ると、オーバーヘッドがある10進数しかありません。事前に必要な戻り値のスケールや精度がわからないので、
SELECT EXTRACT(SECOND FROM TIME '17:12:28.5');
Result: 28.5
SELECT EXTRACT(Epoch FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08');
Result: 982384720.12
参照 PG docs
いつでもextract
の結果をキャストできます。
SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40')::integer;
そうすれば、常に整数を取得できます。
doc によると、日付からフィールドを抽出すると常に整数に収まる結果が生成される場合でも、extract
はdate
タイプでは直接機能しません。
抽出機能は、日付/時刻値から年や時間などのサブフィールドを取得します。 sourceは、タイプtimestamp、time、またはintervalの値式である必要があります。 (日付タイプの式はタイムスタンプにキャストされるため、同様に使用できます。)
したがって、extract(date...)
はそのようなものとしては存在せず、引数の暗黙的なキャストを持つextract(timestamp...)
であり、extract(timestamp...)
は整数のみを返すことはできません。たとえば、extract(seconds from timestamp)
には小数部があります。
それに加えて、extract(Epoch from date)
は19 January 2038
を超える日付のpostgres整数に適合しません( 2038年問題 を参照)。その日付に向かって進むにつれて、それは本当の問題になります。