2011-01-20 20 views
0

私はこれがかなりの間働いていない理由を探していました。私は2つのフィールドを連結し、いくつかの日付比較を実行しようとしていますが、ORA-01843エラーをスローします。有効な月ではありません。私はここで何が間違っているのか分かりません。それは限り、私は最後にそれとステートメントを追加しないと正常に動作Oracle SQLのto_date関数が連結された文字列で機能しない

SELECT 
    sm.semester_date || cp.start_year AS effective 
FROM 
    database.table cp, 
    database.table2 sm 
WHERE cp.semesters_id = sm.semesters_id 
AND to_date(sm.semester_date || cp.start_year, 'MM/DD/YYYY') >= to_date('06/01/2011', 'MM/DD/YYYY') 

は、ここに私のコードです。しかし、私はデータセットをフィルタリングする必要があります。

あなたはフィルターなしでそれを実行すると、それは2010年8月15日を返すなど

私は、この投稿時に、もともと、私はそれを修正してきたマスクを追加するのを忘れ。ただし、このエラーは依然としてORA-01840:入力値が日付書式に不十分です。

解決策を見つけました: まず、皆さんのおかげで、私はこれを手伝ってくれてありがとうございました。第二に、私のエラーは、スタート年なしのコースによって引き起こされていた。それが起こることができないはずなので、非常にイライラします。連結されたアイテムには年がなかったので、エラーを投げていました。私はあなたが私のコードを修正するのを手助けしたので、これを見つけました。ありがとうございました。

+0

"sm.semester_date || cp.start_year"とは何ですか?あなたはそれが 'MM/DD/YYYY'形式であることを保証しましたか? – dimitrisli

答えて

1

私の推測では、デフォルトの日付形式は、TO_DATEに渡す文字列の形式と一致しません。接続文字列の形式を指定するために、フォーマット文字列を2番目のパラメータとして呼び出しに追加します(2番目の呼び出しで行ったように)。日付と年の間の区切りを追加

3

試してみてください。

SELECT 
    sm.semester_date || '/' || cp.start_year AS effective 
FROM 
    database.table cp, 
    database.table2 sm 
WHERE cp.semesters_id = sm.semesters_id 
AND to_date(sm.semester_date || '/' || cp.start_year) >= to_date('06/01/2011', 'MM/DD/YYYY') 

あなたはフィルタなしでクエリを実行すると、それが何を返すのでしょうか?

+0

28秒で殴られる! –

+0

@Justin:最初にクエリを実行し、後で説明します。 – Quassnoi

+0

フィルタなしで実行した場合、2008年8月8日に返されます。 – Micharch54

1

SEMESTER_DATE列はVARCHAR2ですか?もしそうなら、 'MM/DD /'の形式の文字列ですか?または単に「MM/DD」ですか?

lwellerが指摘するように、最初のTO_DATEには、セッションのNLS_DATE_FORMATが 'MM/DD/YYYY'以外の場合に問題となるフォーマットマスクもありません。 SEMESTER_DATEを想定し

が形式 'MM/DD' でVARCHAR2ですが、私はあなたが

AND to_date(sm.semester_date || '/' || cp.start_year, 'MM/DD/YYYY') >= 
     to_date('06/01/2011', 'MM/DD/YYYY') 
0

あなたの最初のTO_DATE()はシステムのデフォルトの形式に依存していたいと思います。 'MM/DD/YYYY'のような適切な書式文字列を持つ第2引数を指定します。比較してください:

SELECT SEMESTER_DATE || START_YEAR AS BARE_STRING, TO_DATE(SEMESTER_DATE || START_YEAR) AS CASTED_TO_DATE 
FROM (
    SELECT '12/31' AS SEMESTER_DATE, 2010 AS START_YEAR 
    FROM DUAL 
); 

SELECT SEMESTER_DATE || START_YEAR AS BARE_STRING, TO_DATE(SEMESTER_DATE || START_YEAR, 'MM/DD/YYYY') AS CASTED_TO_DATE 
FROM (
    SELECT '12/31' AS SEMESTER_DATE, 2010 AS START_YEAR 
    FROM DUAL 
); 
関連する問題