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

Daisuke Yamazaki yamajaki @ gmail.com
2006年 7月 18日 (火) 09:37:26 JST


こんにちは 山崎です.

アドバイスありがとうございます.
date型ですべての時間よりも遅い時間定数が欲しいという理由なのですが,
レコードの有効期限を設定するにあたってデフォルトの値をinfinityにして
間違った入力がないかをcheck制約でチェックしたかったというものでした.


timestamp型だと
設定した値 < TIMESTMP 'infinity'
でOKなのですが,date型だとinfinityにあたるものがないため,少し具合が
悪いのでtimestamp型にして対応することにしました.

int max?をユリウス日に変換するアイディアは参考になりました.
どうもありがとうございます.


On Thu, 13 Jul 2006 17:53:52 +0900
Katsuhiko Okano <k_okano @ po.ntts.co.jp> wrote:

> 岡野です。
> 自分が書いた内容がおかしいことに気づきました。
> 
> > > ドキュメントを読む限り、すべての時間よりも遅い時間定数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")

-- 
Daisuke Yamazaki <yamajaki @ gmail.com>




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