2016-07-10 29 views
0

fromdateとtodateをパラメータとして使用しています。前回の日付をfromdateにしたい場合は、同じ日付の日付をtodateにする必要があります。過去の月の最後の日付ですが、todateがfromdateの月の日付である場合、そのまま置く必要があります。例えば、ユーザーが1-1-2016から25-1-2016までを入力すると、先月1-12-その月の2015から25-12-2016まで、私は日付をチェックする必要があります。それが同じ日付の日付である場合、私はそれを維持しますが、例えば1-1-2016から25-4-2016まで30-1-2016にする。 私はデコードおよびケースを使用しようとしていますが、両方に同じエラー ORA-00907取得しています:欠落している右括弧ORA-00907:oracle sqlのデコードと大文字小文字の右括弧がありません

にする場合には、私のクエリ

select (case (when (LAST_DAY(TRUNC(TO_DATE(:fromdate ,'DD-MM-YYYY') , 'Month')) <> (TO_DATE(:fromdate ,'DD-MM-YYYY'))) 
then (DATE between ADd_MONTHS(TO_DATE(:fromdate ,'DD-MM-YYYY') , -1) and LAST_DAY(TRUNC(TO_DATE(:todate ,'DD-MM-YYYY') , 'Month'))) 
else (DATE between ADD_MONTHS(TRUNC(TO_DATE(:fromdate ,'DD-MM-YYYY') , 'Month'),-1) and TO_DATE(:todate ,'DD-MM-YYYY')) 
end)) 
FROM dual; 

デコード

select DECODE((TO_DATE(:fromdate ,'DD-MM-YYYY')) , LAST_DAY(TRUNC(TO_DATE(:fromdate ,'DD-MM-YYYY') , 'Month')) , 
(DATE between ADd_MONTHS(TO_DATE(:fromdate ,'DD-MM-YYYY') , -1) and ADd_MONTHS(TO_DATE(:todate ,'DD-MM-YYYY') , -1)) , 
(DATE between ADD_MONTHS(TRUNC(TO_DATE(:fromdate ,'DD-MM-YYYY') , 'Month'),-1) and TO_DATE(:todate ,'DD-MM-YYYY')) 
FROM dual ; 
+0

?? THEN以降およびELSEの後には、Oracleの条件(論理式)があります。 DECODEと同じ - 最後の2つの値は "条件"です(...と...の間)。プレーンOracle SQLにはブール値がありません。あなたのCASE/DECODE式は何を返すと思われますか? – mathguy

+0

要件が不明です。あなたが言ったのは、todateは**その月の最後の日ではありません**月の最後の日として置く必要があります。まず、あなたが**その月を言うとき、あなたは何を指していますか?月:fromdate? fromdateマイナス1日?とにかく、あなたの例では、結果は30-1です。これは、どの月の最後の日でもありません。 fromdate、:todate、およびロジックがどのように動作するかを示すいくつかの行が表示された(コード不要)テーブルを表示すると最適です。 – mathguy

+0

@mathguy私はいくつかの更新を行いました。もし私が1-1-2016から20-1-2016の間に置いた場合、私は例を挙げません。私は両方のパラメータの前月を取るべきですが、別の月1-1-2016から20-6-2016まで、前日の最終日まで日付を変更してから、1月20日から31日まで – rawan

答えて

0
select 
    to_date(:from_date) "Original From", 
    to_date(:to_date) "Original To", 
    case when trunc(to_date(:from_date),'MONTH') = trunc(to_date(:to_date),'MONTH') 
     then add_months(to_date(:from_date),-1) 
     else to_date(:from_date) 
    end "New From", 
    case when trunc(to_date(:from_date),'MONTH') = trunc(to_date(:to_date),'MONTH') 
     then add_months(to_date(:to_date),-1) 
     else add_months(trunc(to_date(:from_date),'MONTH'),1)-1 
    end "New To" 
from dual; 
の私のクエリを

SQLデベロップを使用していたときと同じように、すべてのバインド変数の前後にto_dateを配置しましたオペランド文字列を入力として使用します。

関連する問題