• 締切済み

oracleのsqlで日付判断

テーブルに以下の以下の様に日付が登録されています。、 cal_year cal_month cal_day item1 item2 item3 ・・・・・・ : 2019 6 29 2019 6 30 2019 7 1 2019 7 2 ; 2019 7 10 2019 7 11 ; 2019 7 20 2019 7 21 : 2019 7 31 2019 8 1 2019 8 2 : 見ての通り、テーブルに登録されている日付が、年、月、日と各々で 登録されており、また、月と日には、ゼロ埋めされてない値となって います。 因みに、cal_year、cal_month、cal_dayの属性は、varchar2です。 以下のsqlで、日付指定で、システム日付より以降の日付のデータを 取得しようとしているのですが、上手く行きません。 select * from tableA where cal_year||cal_month||cal_day>to_char(sysdate,'FMYYYYMMDD') order by cal_year,to_number(cal_month),to_number(cal_day) ; 今日、2019/7/22でやると、「2019 7 3」以降が出力されます。 また、日付を直接指定するとエラーとなります。 select * from tableA where cal_year||cal_month||cal_day>to_char('2019722','FMYYYYMMDD') order by cal_year,to_number(cal_month),to_number(cal_day) ; 「SQL : ORA-01481: 数値書式モデルが無効です」となります。 何がいけないのでしょうか。 このような使い方はダメなのでしょうか。 それとも、使わない使い方をしているのでしょうか。 お願いいたします。

みんなの回答

  • sngPoi2
  • ベストアンサー率49% (475/953)
回答No.4

sysdateはTimestamp型で、日付用フォーマット'YYYYMMDD'のYYMMはフォーマット上2桁の扱いなので、日付用フォーマットにFMを不可するのは、無意味かと.... 因みに直接記載する場合は、 TO_CHAR(TIMESTSMP '2019-7-9 0:0:0', 'YYYYMMDD')と記述。 下記の様に日付だけでも可。 FMを付けてしまうと... ・TO_CHAR(DATE '2019-7-9', 'YYYYMMDD') →'20190709' ・TO_CHAR(DATE '2019-7-9', 'FMYYYYMMDD') →'201979'

abc999xyz
質問者

お礼

ありがとうございます。 基礎、基本的な質問ばかりですみません。 親切に回答して頂きありがとうございます。

abc999xyz
質問者

補足

すみません。 日付用フォーマット'YYYYMMDD'のYYMMはフォーマット上2桁の扱い YYMM→MMDDでしょうか。 ほんと、初歩的なことですみません。 oracle内では、どうのようなフォーマットで指定しようが たとえば、7/9なら「79」ではなく「0709」で見てしまうって ことでよろしいでしょうか。

  • sngPoi2
  • ベストアンサー率49% (475/953)
回答No.3

回答No.2について理解できるような資料、サイトはありますでしょうか oracle TO_CHAR http://itref.fc2web.com/oracle/function/to_char.html

abc999xyz
質問者

補足

ありがとうございます。 すみません。 sysdateをto_charで文字型に変換するさいのフォーマットで、'FMYYYYMMDD'を指定してので、 2019/7/23の場合、'20190723'となります。 ※FMは付けなくても... どういうことでしょうか。

  • sngPoi2
  • ベストアンサー率49% (475/953)
回答No.2

項目属性がvarchar2なので、 年:2019 月:7 日:3 を結合すると、'201973'となります。 ※lpadで、2桁の前ZERO補正後結合すると、' 20190703'に sysdateをto_charで文字型に変換するさいのフォーマットで、'FMYYYYMMDD'を指定してので、 2019/7/23の場合、'20190723'となります。 ※FMは付けなくても... where句で、この2つを比較判定するので、正しく処理されません。

abc999xyz
質問者

お礼

FMは付けなくても、YYYYMMDD形式になるとはしりませんでした。 ありがとうございます。

abc999xyz
質問者

補足

回答No.2について理解できるような資料、サイトはありますでしょうか

  • sngPoi2
  • ベストアンサー率49% (475/953)
回答No.1

シンプルに下記では、どうですか? where to_char(sysdate,'YYYYMMDD') < cal_year || lpad(cal_month,2,'0') || lpad(cal_day,2,'0') order by cal_year ,lpad(cal_month,2,'0') ,lpad(cal_day,2,'0')

abc999xyz
質問者

お礼

ありがとうございます。 lpadでゼロ埋めされたらうまくいきました。 1つ教えてほしいのですが、 私が書いたsqlだとなせうまくいかないのでしょうか。

関連するQ&A