2017-04-13 9 views
0

「SYSDATE」が特定の日付(つまり、日付の一部)に一致するかどうかを基本的に確認する次のSQLがあります(< = SYSDATE < =ORA-01861 NUMBER(8)列でエラーが発生しました

TO_DATE(TO_CHAR(SYSDATE, 'YYYYMMDD')) BETWEEN TO_DATE(TO_CHAR(T1.WEB_STR_DT, 'YYYYMMDD')) AND 
    TO_DATE(TO_CHAR(T1.WEB_STR_DT, 'YYYYMMDD')) + 30 

私が直面しています問題は、私はしても日付が有効な日付形式(YYYYMMDD)にあるORA-01861を取得していることです。

このエラーの原因は何ですか?

+1

「TO_CHAT」?二倍?本当に? –

答えて

1

あなたは、全く文字列にしてからsysdateを変換すべきではない - ORA-018611エラーの原因となっているものです。あなたのNLS_DATE_FORMATはYYYYMMDDではありません。あなたは明示的に、あなたのNLS設定が現在あるものは何でも使用して、日付に戻って、結果の文字列を変換しようとすると、その形式に日付を変換します。

select to_date(to_char(sysdate, 'YYYYMMDD')) from dual; 

ORA-01861: literal does not match format string 

select to_date(to_char(sysdate, 'YYYYMMDD'), 'YYYYMMDD') from dual; 

TO_DATE(T 
--------- 
13-APR-17 

しかし、その代わりにあなただけのtrunc(sysdate)を使用することができます。その時間は深夜0時に戻ってくるので、今日はWEB_STR_DTと表現すれば一致します。

しかし、それだけでは問題ではありません。最初に日付を数値として格納するべきではありませんが、20170413のような数値を日付に変換する必要がある場合は、最初に文字列に変換してからその文字列を日付に変換する必要があります。

基本的に間違った場所にかっこを持っている、との代わりに、

TO_DATE(TO_CHAR(T1.WEB_STR_DT, 'YYYYMMDD')) 

あなたが持っている必要があります。

TO_DATE(TO_CHAR(T1.WEB_STR_DT), 'YYYYMMDD') 

あなたのコードは、相当やっている:

select to_date(to_char(20170413, 'YYYYMMDD')) from dual; 

ORA-01481: invalid number format model 

を数値を文字列に変換するために日付形式のモデル要素を使用しようとしているからです。その括弧を動かすと、同じ日付になります。

だから、あなたが行うことができます:

TRUNC(SYSDATE) BETWEEN TO_DATE(T1.WEB_STR_DT, 'YYYYMMDD') 
    AND TO_DATE(T1.WEB_STR_DT, 'YYYYMMDD') + 30 
:あなたがそうであっても単純になり、それらのための書式モデルを供給されていないので

TRUNC(SYSDATE) BETWEEN TO_DATE(TO_CHAR(T1.WEB_STR_DT), 'YYYYMMDD') 
    AND TO_DATE(TO_CHAR(T1.WEB_STR_DT), 'YYYYMMDD') + 30 

でも明示的TO_CHAR()呼び出しは、少し不要です

1

数値変換の問題(とは何ですか?to_chatとは何ですか...)

TRUNCをお試しください:それは無駄であるだけでなく、暗黙的な変換を行っているよう

WHERE trunc(sysdate) between trunc(T1.WEB_STR_DT) and trunc(T1.WEB_STR_DT)+30 
関連する問題