1
IF (To_Char(Date1,'Day') = 'Sunday' Or To_Char(Date2,'Day')  = 'Sunday') Then
SELECT columns ... FROM Table_Name;

ELSE
SELECT columns ... FROM Table_Name;

これは機能していません。

4

1 に答える 1

2

フォーマット モデルでフォーマット モデル修飾子,を使用していないため、「機能していません」fm。フォーマット モデル修飾子を使用していないため、曜日は 9 文字 (最長の水曜日の長さ) になるまでスペースで右側に埋め込まれます。これは、平等のテストが正しくないことを意味します。

それを修正するには、フォーマット モデル修飾子を使用します。

to_char(date1, 'fmDay')

このクエリを実行して、問題と解決策の両方のデモンストレーションを行うことができます。

with a_week as (
  select sysdate - level as dy
    from dual
 connect by level <= 7 )
select dy
     , to_char(dy, 'Day')
     , length(to_char(dy, 'Day'))
     , to_char(dy, 'fmDay')
     , length(to_char(dy, 'fmDay'))
  from a_week

このSQLフィドルを参照してください

私は気にしないと言った。なぜあなたは一日中入力する必要があるのですか? DY代わりにフォーマット モデルを使用します。

if to_char(date1,'DY') = 'SUN' or to_char(date2,'DY') = 'SUN' then
   ...

これは常に 3 文字の長さです。

デバッグに関する簡単なメモ。最初の IF ステートメントが正しく実行されていないことがわかっている場合は、次の段階に従います。

  1. IF ステートメントからテストを取り出し、SELECT に入れます。等しいかどうかをテストしている 2 つのものが同一であることを確認します。
  2. それらがそうではないことがわかったら、フォーマットモデルが問題であることを知っています。フォーマットモデルと呼ばれていることを知らないかもしれませんが、TO_CHAR() で使用しているので、そのドキュメントに向かいます。
  3. TO_CHAR() ドキュメントは、フォーマット モデル修飾子を見つけることができるフォーマット モデルを示しています。
于 2013-06-15T09:16:56.050 に答える