• ベストアンサー

SQLのDATEタイプ

質問です。 SQLでフィールドタイプをDATE型で指定した場合 7桁となるようなのですが、どのような形になるのでしょうか? 2002/02/21だと10桁になってしまいますし・・・ 02/02/21ですと8桁になってしまいます。 よろしくお願い致します。

noname#11049
noname#11049

質問者が選んだベストアンサー

  • ベストアンサー
  • maro200
  • ベストアンサー率45% (15/33)
回答No.1

何のデータベースかわからないと答えられないですが、 SQL Serverだと、こんな感じです。 datetime 型の値は、Microsoft® SQL Server™ により、内部的に 2 つの 4 バイトの整数として格納されます。最初の 4 バイトは "基準日"、つまり 1900 年 1 月 1 日からの日数、またはこの日までの日数を格納します。基準日は、システムが参照する日です。datetime 値は 1753 年 1 月 1 日より前の日付には使用できません。残りの 4 バイトは、午前 0 時から数えたミリ秒の数として表された時間を格納します。 smalldatetime 型は、日付および時間を datetime よりも低い精度で格納します。SQL Server は、smalldatetime 値を 2 つの 2 バイトの整数として格納します。最初の 2 バイトは、1900 年 1 月 1 日からの日数を格納します。残りの 2 バイトは、午前 0 時からの分数を格納します。日付の範囲は 1900 年 1 月 1 日から 2079 年 6 月 6 日までで、分単位までの精度です。

noname#11049
質問者

お礼

ありがとうございました。丁寧な説明でよく理解することができました。

その他の回答 (1)

  • msmiyabin
  • ベストアンサー率20% (11/55)
回答No.2

ORACLEだとDATE型は7バイト固定長になりますね。 日付のフォーマットですが、規定のフォーマットはCREATE DATABASE時に指定したNLS_LANGUAGEで定義されます。 ですから、どんな定義でも対応できるように7バイトで取っているというのが正しいです。(どのような定義方法でも0.1秒まで管理されます) 例としてNLS_LANGUAGEがJapanese_Japan.JA16SJISの場合は 'YYYY/MM/DD HH:MI:SS' です。 (INSERT文ではto_dateを使用してます。) ちなみにセッションごとの日付のフォーマットは、NLS_DATE_FORMATパラメータで制御します。

noname#11049
質問者

お礼

ありがとうございました。大変役に立ちました。

関連するQ&A

  • date型のselect について

    質問させてください。 今、テーブル(test_tbl)にフィールドjikan(date型)があるとします。 jikanフィールドの値を取得したいのですが、 select to_date(jikan, 'YYYY/MM/DD HH24:MI:SS') from test_tbl; と実行すると、 01-11-10 01-11-11 01-11-12 01-11-13 01-11-14 01-11-15 01-11-16 となってしまいます。 質問店としては、 なぜ、フォーマットを指定しているにもかかわらず、 (1) 年が4桁表示ではなく、2桁表示なのか? (2) 時間部分は表示しない、もしくはデータがない? の2点をお教えください。 ご迷惑をお掛けしますが、宜しくお願い致します。

  • SQL分のWHERE句について

    SQLのWHERE句について ================================== ABC :入力値(2又は5バイトの可変) T.テーブル.フィールド:ABCが格納されているテーブル(格納すると同時に5桁になります。) 例:01(入力値)⇒01000(格納値) ================================== 参照時のWHERE句の作成の仕方を教えてください。 ※検索値が2桁の場合は、格納値5桁の前方2桁一致でHITさせます。  また5桁の場合は、格納値5桁の全一致です。 今考えているのでは、 IF ABC <> "" THEN IF LenB(ABC) = 2 THEN SQL_WHERE = SQL_WHERE & "AND (LEFT(T.テーブル.フィールド,2) = '" & ABC & "' )" ELSEIF SQL_WHERE = SQL_WHERE & "AND (T.テーブル.フィールド = '" & ABC & "')" END IF END IF です。 宜しくお願いします

  • SQLでの日付比較

    いつもお世話になっております。 SQL文に関して質問ですが、テーブルに年と月が別に入っているフィールド(4桁、2桁の数値型)があり本日から3年以内のものを抽出するにはどうやって書くのがいいのでしょうか? 日付のフィールドは無いので計算するのは月だけでいいのですが・・・。 よろしくお願いいたします。

  • Oracle10gのSQL分について

    Oracle10gのSQL分についての質問です。 [A]テーブルがあります。 フィールドは、 [CODE](key) [DATE1] [DATE2] [DATE3] と、あります。内容は、 A 2006/07/01 2006/07/04 2006/07/07 B 2006/07/03 2006/07/08 2006/07/05 C 2006/07/02 2006/07/06 2006/07/09 と、あります。 結果を A 2006/07/01 C 2006/07/02 B 2006/07/03 A 2006/07/04 B 2006/07/05 C 2006/07/06 A 2006/07/07 B 2006/07/08 C 2006/07/09 と、したいのです。つまり、3つのフィールドの日付順にしたいのです。 出来るのでしょうか? 宜しくお願い致します。

  • Datetime型とDate型

    SQLServer2008 ですが、日付のフィールドにこれまで使っていたDatetime型をDate型にしてみました。 連結Formでの画面表示が「2009/07/27」→「2009-07-27」に変わりました。 テーブルの表示時も同様に「-」になりました。   Dim wk_date date   if SQL_date = wk_date then   ・・・ 上記のAccessVABのIF文で・・・ 実際には同じ日付なのにマッチしなくなってしまいました。 Format関数で「yyyy-mm-dd」へ変換すればマッチします。 上記のwk_dateをSQLのフィールドに代入し書き込むとエラーにならず 「yyyy-mm-dd」の形へ変換されています。 質問 (1) 「-」でなく今まで通りの「/」にする事は出来ないでしょうか? (2) 比較時は変換するしかないのでしょうか?   (代入時は自動的に変換できているのに比較時も自動でやってくれても良さそうなんですが・・・)

  • SQLで質問です。

    SQLで以下のようなレコードを引くことは出来るでしょうか。 オラクル9です。 フィールド1  フィールド2  フィールド3  フィールド4  5... (1~4でキー) A  あ  1  2011/01/01  ... A  い  1  2011/01/01  ... 以上のように、複数のキーの中でひとつだけ違うレコードを出すSQLはどう組めばよいでしょうか。 「あ」と「い」両方出したいのと、「う」があっても「あ」と「い」に限定できれば最高です。 よろしくお願い致します。

  • Oracl の SQL文について

    Oracl の SQL文について、教えて下さい。 [A]テーブルに [CODE] と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE] と [DATE] と [MONEY] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 A-1 2005/01/02 200 A-2 2005/01/01 300 A-2 2005/01/10 400 A-2 2005/12/10 500 と、します。 [DATE]の条件を、2005/01/01~2005/01/31とし、結果を A-1 NAME-1 300 A-2 NAME-2 700 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? よろしくお願い致します。

  • SQLの質問です

    SQL初心者の質問です。下記のように違うdateを持つ同じgrade_idがいくつか存在するテーブルから、最新のdateのgrade_idを選択してその列の他の情報(point)も持って来たい場合、どんなSQL文が最適でしょうか?Disthinctを使ってもうまくできずに困っています…よろしくお願い致します。 id date grade_id point 1 2008/05/01 1 6 2 2008/10/01 1 1 3 2000/08/08 2 2 4 2008/05/01 2 8

  • SQLの質問です

    SQL初心者の質問です。下記のように違うdateを持つ同じgrade_idがいくつか存在するテーブルから、最新のdateのgrade_idを選択してその列の他の情報(point)も持って来たい場合、どんなSQL文が最適でしょうか?Disthinctを使ってもうまくできずに困っています…よろしくお願い致します。 id ・ date ・ grade_id ・ point 1 ・ 2008/05/01 ・ 1 ・ 6 2 ・ 2008/10/01 ・ 1 ・ 1 3 ・ 2000/08/08 ・ 2 ・ 2 4 ・2008/05/01 ・ 2 ・ 8

  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?