web-dev-qa-db-ja.com

日付からの関数extract()は倍精度値を返します

Postgres関数extract()date値からdouble precisionを返すのはなぜですか?

私が想像できる唯一の理由は、カレンダーを使用するいくつかのロケール(グレゴリオ暦ではなく、Postgresでサポートされているもの)があり、日付/時刻を異なる方法で計算し、可能な浮動小数点数を返すことです。

7
simar

これは、戻り値が大きくなるか、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

5
gbn

いつでもextractの結果をキャストできます。

SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40')::integer;

そうすれば、常に整数を取得できます。

3
Nerian

doc によると、日付からフィールドを抽出すると常に整数に収まる結果が生成される場合でも、extractdateタイプでは直接機能しません。

抽出機能は、日付/時刻値から年や時間などのサブフィールドを取得します。 sourceは、タイプtimestamp、time、またはintervalの値式である必要があります。 (日付タイプの式はタイムスタンプにキャストされるため、同様に使用できます。)

したがって、extract(date...)はそのようなものとしては存在せず、引数の暗黙的なキャストを持つextract(timestamp...)であり、extract(timestamp...)は整数のみを返すことはできません。たとえば、extract(seconds from timestamp)には小数部があります。

それに加えて、extract(Epoch from date)19 January 2038を超える日付のpostgres整数に適合しません( 2038年問題 を参照)。その日付に向かって進むにつれて、それは本当の問題になります。

1
Daniel Vérité