みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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: 数値書式モデルが無効です」となります。


何がいけないのでしょうか。
このような使い方はダメなのでしょうか。
それとも、使わない使い方をしているのでしょうか。

お願いいたします。

投稿日時 - 2019-07-22 10:34:08

QNo.9637947

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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'

投稿日時 - 2019-07-29 10:44:01

補足

すみません。
日付用フォーマット'YYYYMMDD'のYYMMはフォーマット上2桁の扱い
YYMM→MMDDでしょうか。

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

投稿日時 - 2019-07-29 13:57:03

お礼

ありがとうございます。

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

投稿日時 - 2019-07-29 12:57:31

ANo.3

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

oracle TO_CHAR
http://itref.fc2web.com/oracle/function/to_char.html

投稿日時 - 2019-07-26 13:31:16

補足

ありがとうございます。

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

投稿日時 - 2019-07-26 18:48:05

ANo.2

項目属性がvarchar2なので、
年:2019 月:7 日:3
を結合すると、'201973'となります。
※lpadで、2桁の前ZERO補正後結合すると、'
20190703'に

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

where句で、この2つを比較判定するので、正しく処理されません。

投稿日時 - 2019-07-23 12:31:08

補足

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

投稿日時 - 2019-07-26 10:24:09

お礼

FMは付けなくても、YYYYMMDD形式になるとはしりませんでした。

ありがとうございます。

投稿日時 - 2019-07-25 11:10:55

ANo.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')

投稿日時 - 2019-07-22 13:07:58

お礼

ありがとうございます。
lpadでゼロ埋めされたらうまくいきました。

1つ教えてほしいのですが、
私が書いたsqlだとなせうまくいかないのでしょうか。

投稿日時 - 2019-07-23 08:43:20

あなたにオススメの質問