2009-03-31 12 views
0

私は現在、それが祝日であるかどうかによって(別の制約の中ではっきりと)動作が異なるプロジェクトに取り組んでいます。この目的のために、私は日付とその曜日を含むテーブルを作成しようとしています( '休日'を8週目の曜日とみなして)。Oracle:日付のSELECT CASE文で正しくフォークしないプログラム

私は私が唯一のフィールド、holidaydateDATEデータ型)を持つholidayという名前から休日、のリストを調達していますテーブルを持っています。値を入れる表はという名前で、dayDATEデータ型)とdayofweekCHAR(10)データ型)の2つのフィールドがあります。

私がテストしている間、これは私が今のところ持っているロジックです。

残念ながら、現在のところ、「休暇」ではなく「水曜日」が返されます。私はWHEN sysdate INWHEN to_char (sysdate, 'dd-mon-yyyy') INかその行に沿って変更する必要があると感じていますが、私はいくつかのバリエーションを試しましたが、これまでにはうまくいきませんでした。

提案がありますか?

答えて

5

時間情報。したがって、あなたが言及しているケースはほとんど決して実行されません。

あなたのケースの日付の重要な部分だけを比較してみてください。

CASE 
    WHEN TRUNC(SYSDATE) IN (SELECT TRUNC(h.holidaydate) from holiday h) 

これは動作するはずです。

+0

+1ですが、to_char変換の代わりにTrunc(sysdate)を使用することをお勧めします。コードの目的をよりよく反映していると私は思う。 –

+0

大きなアドバイス。あなたの提案を反映するために私の答えを編集するなら、あなたと一緒にOKでしょうか?ありがとう! –

+0

これを編集するだけで、このサイトのアイデアの一部です。 –

0

あなたは

  • は、あなたはそれが正しいだことを確認するために、最初の文での休日のテーブルに挿入されているものにチェックしまし提案を求めたそう...?
  • sysdateを写真から取り除こうとしましたか(たとえば定数を使用しています)、それが問題の原因かどうかを確認しましたか?
  • インナーセレクトを定数リストに置き換えてみましたか?

    CASE 
        WHEN sysdate IN 
         (SELECT h.holidaydate FROM holiday h) 
    

    あなたは休日テーブルにSYSDATEを挿入すると、それは日付に挿入されます、ので:私はあなたの問題は、それがこのケースに達することはほとんどないだろうということだと思います

2

あなたの休暇テーブルでは、日付のみに関心があり、時間の構成要素には関心がありません。これを強制し、あなたが作った同じ間違いを犯して人を停止するには制約を置く:

CREATE TABLE HOLIDAY 
(holidaydate DATE NOT NULL 
       CONSTRAINT DateOnlyNoTime 
       CHECK (holidayDate = TRUNC(holidayDate))); 

間違いなくあなたは、主キーといくつかの他の列をお勧めします。

日付の日付/時刻部分を削除することをお勧めします。パフォーマンス上の理由から、TO_DATE()ではなくTRUNC()を使用してください。あなたのサンプルクエリは次のようになります:

SELECT sysdate, 
    (
    CASE 
    WHEN TRUNC(sysdate) IN 
     (SELECT h.holidaydate FROM holiday h) 
    THEN 'holiday' 
    ELSE TO_CHAR(sysdate , 'day') 
    END) 
FROM dual; 
+0

+1ですが、オプティマイザが制約を読み取って結果セットの予想されるカーディナリティを誤って減らす可能性のある述語として適用する旧バージョンのOracleには注意が必要です。 –

関連する問題