日付を使った作業は完全に正しくありません。潜在的な場所がいくつかあるため、正確な場所を特定するのは困難です。このコードの何が問題になっているのかを説明します(「89行目」のステートメントから取得):
... FP_BASIC_BD."DATE">=TO_CHAR(TRUNC(TO_DATE(GTT_DWM_STATS.CLOSINGDATE,'DD-MON-YY'), 'IW'),'DD-MON-YY') ...
GTT_DWM_STATS.CLOSINGDATE
日付形式があります(DDLステートメントによる)。ただし、to_date
関数は最初のパラメーターとして文字列を取ります。この場所で、Oracleは次のことを行います。
- 暗黙的に日付を文字列に変換します(セッションの形式を使用)
- 次に
to_date
関数は、文字列を'DD-MON-YY'
で記述された日付として扱い、日付に変換し直そうとします。 フォーマット - 次に
trunc
日付を切り捨てます - 次に
to_char
再度文字列に変換し、文字列を日付と比較します(おそらく)FP_BASIC_BD."DATE"
- if
FP_BASIC_BD."DATE"
が日付の場合、Oracleは等号の右側の式の結果を暗黙的に日付に変換します - または
FP_BASIC_BD."DATE"
の場合 が文字列の場合、Oracleは文字列比較のルールに従って文字列を比較します。
ここで必要なのは、不要な変換をすべて取り除くことです。
FP_BASIC_BD."DATE" >= TRUNC(GTT_DWM_STATS.CLOSINGDATE, 'IW')
その後、日付を処理している他のすべてのステートメントを注意深く確認する必要があります。関数が入力パラメーターとして日付を受け取る場合、関数が文字列を受け取る場合は日付を渡す必要があります-文字列を渡します。比較についても同じです。文字列を文字列と比較し、日付を日付と比較します。