[pgsql-jp: 37345] Re: date 型のinfinityについて

Katsuhiko Okano k_okano @ po.ntts.co.jp
2006年 7月 13日 (木) 17:53:52 JST


岡野です。
自分が書いた内容がおかしいことに気づきました。

> > ドキュメントを読む限り、すべての時間よりも遅い時間定数infinityは
> > timestamp型でしか使えないようなのですが,date型ですべての時間よりも
> > 遅い時間定数を使用する方法はありますか?
> > 
> > http://www.postgresql.jp/document/pg813doc/html/datatype-datetime.html
> 
> なぜ定数と書かれたのか理由が分からないのでまとはずれかもしれませんが、
> 上記URLにあるドキュメントの「8.5. 日付/時刻データ型」を読むと、date型は
> 最遠の過去=4713 BC、 最遠の未来=5874897 AD、 精度=1日
> とあるので、ユリウス日(紀元前4712年1月1日からの通算経過日)の0日目を
> date型に変換して使うアイデアはどうでしょう。

下記の結果を見ると分かるように、もし使うなら
ユリウス日の1日目を使う方がよさそうです。
また、数字に0やマイナスは指定しないほうがいいでしょう。

testdb=# SELECT to_date(1, 'J');
    to_date
---------------
 4714-11-25 BC
(1 row)

testdb=# SELECT to_date(0, 'J');
    to_date
---------------
 0001-01-01 BC
(1 row)

testdb=# SELECT to_date(1721060, 'J');
    to_date
---------------
 0001-01-01 BC
(1 row)

testdb=# SELECT to_date(-1, 'J');
    to_date
---------------
 4714-11-23 BC
(1 row)

testdb=# SELECT to_date(-120296, 'J');
    to_date
---------------
 4560-06-19 BC
(1 row)

testdb=# SELECT to_date(-120297, 'J');
    to_date
----------------
 11754179-08-04
(1 row)


#なぜ-120296が境界線なのかよく分かりませんが、
#こういう謎の挙動は(パッチ案を書いて)報告したほうがいいんですかねぇ。。。
参考:ソースファイル
http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/utils/adt/
datetime.c?rev=1.167


> 
> testdb=# SELECT to_date(0, 'J');
>     to_date
> ---------------
>  0001-01-01 BC
> (1 row)
> 
> testdb=# SELECT to_date(1721426, 'J');
>   to_date
> ------------
>  0001-01-01
> (1 row)
> 
> testdb=# SELECT to_date(2453930, 'J');
>   to_date
> ------------
>  2006-07-13
> (1 row)
> 
> testdb=# SELECT to_date(2147483646, 'J');
>     to_date
> ---------------
>  5874898-06-02
> (1 row)
> 
> testdb=# SELECT to_date(2147483647, 'J');
>     to_date
> ---------------
>  5874898-06-03
> (1 row)
> 
> testdb=# SELECT to_date(2147483648, 'J');
>     to_date
> ---------------
>  5874898-06-03
> (1 row)
> 
> testdb=#
> 
> 
> ドキュメントの「8.5.4. 内部」には、以下のような記述があるため
> date型にどんな意味のデータを入れるかによっては何か注意が必要なのかもしれませ
ん。
> > PostgreSQLは全ての日付と時刻の計算にユリウス日を使っています。
> > これは、紀元前4,713年から未来までの全ての日付を、1年は365.2425日で
> > あると仮定し正確な予測や計算をするという優れた特性を持っています。 
> > 
> > 19世紀以前の日付規則はおもしろい読み物にはなりますが、
> > 日付/時刻ハンドラの正しいコーディングを保証することは
> > 整合性について完璧ではありません。
> ----------------------------------------
> Katsuhiko Okano
> k_okano at po.ntts.co.jp
> NTT Sofrware Corp. (division "NBRO-PT4")
> 
----------------------------------------
Katsuhiko Okano
k_okano at po.ntts.co.jp
NTT Sofrware Corp. (division "NBRO-PT4")



pgsql-jp メーリングリストの案内