2017-05-18 12 views
1

WHERE句にcase文を書く必要があります。- current_dateがMonthの1番目のときにデータを選択します。前の月の最初の日と前の月の前月 ELSE FROM 1st Curr月の日付まで。私はこれまでこれを書いてきましたが、うまくいきません。 '05/01/2017 'は入力日となります。TERADATAの場合WHERE節の文

SELECT * 
FROM MyTable 
WHERE calendar_date 
    BETWEEN 
     CASE WHEN extract (day from CAST('05/01/2017' AS DATE FORMAT 'MM/DD/YYYY')) =1 --check to see date is 1st of month 
     THEN ADD_MONTHS((CAST('05/01/2017' AS DATE FORMAT 'MM/DD/YYYY') - EXTRACT(DAY FROM CAST('05/01/2017' AS DATE FORMAT 'MM/DD/YYYY'))+1), -1) --1st of prev month 
       AND ADD_MONTHS(CURRENT_DATE - EXTRACT(DAY FROM CURRENT_date), 0) --last day prev month 
     ELSE    CAST('05/01/2017' AS DATE FORMAT 'MM/DD/YYYY') - EXTRACT(DAY FROM CAST('05/01/2017' AS DATE FORMAT 'MM/DD/YYYY'))+1, 0) --else 1st of Curr mont 

     AND CURRENT_DATE 
    end 
    order by calendar_date 
+0

ちょっとした提案ですが、SELECT句で必要なフィールドを派生させて、インライン表示(サブクエリ)でラップすることができます。条件付きロジックから派生した値を見ることができれば、コードを読みやすく(そしてデバッグしやすく)することができます。 – Sevyns

+0

@Sevyns、あなたはあなたが提案しているものの例を教えてください。 – SilverFish

+0

開始日のリテラルは、 'date '2017-05-01''のように' select date'と書かれています。2017-05-01 '+ 1' –

答えて

1
select  * 

from  mytable 

where  calendar_date between case 
             when td_day_of_month (current_date) = 1 
             then current_date - interval '1' month 
             else td_month_begin (current_date) 
            end 

          and  case 
             when td_day_of_month (current_date) = 1 
             then current_date - 1 
             else current_date 
            end 


order by calendar_date 
0

@Duduは、あなたの提案に基づいて、私はSQLを解決することができました。

SELECT * FROM MYTABLE 
         WHERE CALENDAR_DATE 
          BETWEEN 
           CASE WHEN extract (day from CAST('05/15/2017' AS DATE FORMAT 'MM/DD/YYYY')) = 1 
             THEN (ADD_MONTHS((CAST('05/15/2017' AS DATE FORMAT 'MM/DD/YYYY') - EXTRACT(DAY FROM CAST('05/15/2017' AS DATE FORMAT 'MM/DD/YYYY'))+1), -1)) 
             ELSE   ADD_MONTHS(CURRENT_DATE - EXTRACT(DAY FROM CURRENT_DATE)+1, 0) 
           END 
          AND 
            CASE WHEN extract (day from CAST('05/15/2017' AS DATE FORMAT 'MM/DD/YYYY')) > 1 
             THEN  CURRENT_DATE 
             ELSE   ADD_MONTHS(CURRENT_DATE - EXTRACT(DAY FROM CURRENT_date), 0) 
           END 
           AND REPORTNAME_MASTER_ID IN (2565,5216,5364) 
         order by CALENDAR_DATE 
+0

'CAST('05/15/2017 '日付形式' MM/DD/YYYY ')'は '日付' 2017-05-15''で置き換えることができます –