2017-04-17 1 views
0

Je suis nouveau sur Teradata. Voici la situation:?Déclarez les paramètres dans la requête Teradata OU If-then-else

Si CURRENT_DATE est < 15 du mois, puis paramètre StartDate = 1er mois préc et EndDate param = dernière date du mois en cours

SELECT ... FROM ViewA 
WHERE date BETWEEN ?Startdate AND ?EndDate 

ELSE si CURRENT_DATE> = 15 puis paramètre = Startdate 1er du mois courant et EndDate param = dernière date du mois en cours

SELECT ... FROM ViewA 
WHERE date BETWEEN ?Startdate AND ?EndDate 

Je suis en mesure de calculer les dates dans l'e cas, mais ne peut pas comprendre:

# 1) comment les mettre dans les paramètres. Si je peux les mettre dans params alors tout ce que je dois faire est

SELECT ... FROM ViewA 
WHERE date BETWEEN ?Startdate AND ?EndDate 

OU # 2) Ecrire un IF-THEN-ELSE

If Current_date is < 15 of month 

    SELECT ... FROM ViewA 
     WHERE Date BETWEEN 
     ADD_MONTHS((DATE - EXTRACT(DAY FROM DATE)+1), -1) AND ADD_MONTHS(LAST_DAY(DATE),0) 
    ELSE 
    SELECT ... FROM ViewA 
     WHERE date BETWEEN 
     ADD_MONTHS((DATE - EXTRACT(DAY FROM DATE)+1), 0) AND ADD_MONTHS(LAST_DAY(DATE),0)) 

END IF 

S'il vous plaît guider comment atteindre # 1 ou # 2. Je NE PEUX PAS créer de fonction ou de procédure stockée dans la teradata

+0

Votre colonne est-elle vraiment nommée 'date'? Si c'est le cas, vous devez le mettre entre guillemets. Je ne sais pas si cela fonctionnerait de cette façon, ou en comparant avec la date réelle. – ULick

+0

Non, il n'est pas nommé 'date' mais c'est un champ date – SilverFish

Répondre

0

# 2 en utilisant le calendrier comme exemple.

SELECT calendar_date from Sys_Calendar.CALENDAR 
    WHERE calendar_date 
     BETWEEN 
     case when extract (day from current_date) < 15 
       then ADD_MONTHS((current_date - EXTRACT(DAY FROM current_date)+1), -1) 
       else    current_date - EXTRACT(DAY FROM current_date)+1 
     end 
     AND ADD_MONTHS(LAST_DAY(current_date),0) 
    order by calendar_date 
    ; 

Je préfère le current_date, ne peut pas être confondu avec le type de données.

+0

Si nous parlons de performance, il peut être avantageux de mettre le select ci-dessus dans une table volatile et de le joindre à votre vue. – ULick

+0

@ULick, a travaillé !!! Merci – SilverFish

0
WHERE date 
BETWEEN Trunc(current_date - 14 , 'mon') -- first day of the month 14 days before today 
    AND last_day(current_date)   -- last day of current month