2017-05-18 2 views
1

Je dois écrire une déclaration de cas dans la clause WHERE, qui est - lorsque current_date est le 1er du mois puis sélectionnez les données entre le 1er jour du mois précédent ET le dernier jour le mois précédent AUTRE du mois de Curr jusqu'à la date. J'ai écrit ceci jusqu'ici mais cela ne fonctionne pas. '05/01/2017 'sera la date d'entrée.TERADATA cas où instruction dans la clause 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

Juste une suggestion, mais vous pouvez dériver les champs dont vous avez besoin dans la clause SELECT et encapsuler la requête dans une vue en ligne (sous-requête). Pourrait rendre le code plus facile à lire (et déboguer) plus tard si vous pouvez voir les valeurs dérivées de la logique conditionnelle. – Sevyns

+0

@Sevyns, Pouvez-vous donner un exemple de ce que vous suggérez? – SilverFish

+0

Pour commencer, la date littérale est écrit comme: 'date '2017-05-01'' comme dans' select date' 2017-05-01 '+ 1' –

Répondre

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, en fonction de votre suggestion, j'ai pu résoudre le sql. le voici:

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 'EN DATE FORMAT' MM/DD/YYYY ')' pourrait (et devrait) être remplacé par 'date' 2017-05-15'' –