- ベストアンサー
Oracle11gのDATE型
オラクルマスターのBronzeSQL基礎の勉強をしております。 テキストでDATE型の説明を読んで「日付、時刻を含む固定長7バイトの日付データ型」と書かれていてアレッと思いました。 日付と時刻はデータベースではどのように持っているのでしょうか? ご存知のかたがおられましたら教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1 のmuyoshid です。 > 例えばですが、DATE型のカラムに「09/03/15 11:42」という値を・・・ Oracle はユリウス日 (紀元前4713年1月1日) からの経過日数+秒で日付データ を管理しています。 紀元前4713年1月1日から2009年3月15日の経過日数は、2454906日です。 こでに、11:42 は (午前とすると) 経過秒は42120秒となります。 1日は、86400 秒なので0.4875 となり、2454906.4875 として格納されます。 Oracle がサポートしているのは、西暦9999年までなので、約540万 がDATE 型 データが内部で取り得る最大の値となります。 Date型データの詳細は、以下のマニュアル (SQL 言語リファレンス) を参照して下さい。 http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05750-03/sql_elements.htm#33467 因みにTIMESTAMP データ型も小数部の精度を上げているだけで内部の管理方法は 同じです。
その他の回答 (2)
- mitoneko
- ベストアンサー率58% (469/798)
基準日から何日たったかを実数で格納しています。単位が日ですから、何時間何分何秒は小数になりますね。 例えば、基準日を1990年1月1日0:00に取ります。 さて、1990年1月2日0:00はどうやって表現してあるかというと、基準日より1日ちょうどたってますから、1.0とデータベースには格納されます。1991年1月1日12:00だったら、366.5となります。基準日が何年だったか忘れましたが、こうやって格納しておけば、7バイトもあれば十分なわけです。ただし、欠点は、基準日からの日数を日付に直す計算をしないと表示できないわけですが、この計算のアルゴリズムは昔から知られたものが存在しますので、たいした欠点にはなりません(所詮、データベースを利用するプログラマやユーザーはまったく知る必要もないことでもあります。オラクルが全部自動でやってくれますから(笑)) 一方利点は、日付の加減算をする時に、日付特有のもろもろの規則をまったく考慮しなくてすむことです。普通に足し算・引き算するだけで結果が出ますから。 アルゴリズムに関する詳しい資料の例として、参考URLを一つ書いておきます。グレゴリオ暦とかユリウス暦というキーワードで検索すれば、かなりの資料があります。
お礼
納得できました。 ありがとうございます。
- muyoshid
- ベストアンサー率72% (230/318)
こんにちわ。 > 日付と時刻はデータベースではどのように持っているのでしょうか? 内部的には、7Byte の数値型データで、整数部で基準日からの経過日数を、 小数部で00:00:00 からの秒数を管理しています。 ですので、sysdate + 1 (翌日) や、sysdate - 1/4 (6時間前) 等の演算を 行う事ができます。
お礼
さっそくのご回答ありがとうございます。 例えばですが、DATE型のカラムに「09/03/15 11:42」という値を入れるとします。 日付と時分まで考慮すると7Byteでは表現できないと思うのですが、どうやって値を保持するのでしょうか? すみませんが教えてください。
お礼
納得できました。 ありがとうございます。 それにしてもOracleって内部的に凄い計算してるんですね。