2017-04-17 272 views
0

我是Teradata的新手。这里的情况是:??在Teradata查询中声明参数或者If-then-else

如果CURRENT_DATE是一个月的< 15再上一个月份的开始日期参数= 1和结束日期PARAM =最后的当月日期

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

否则,如果CURRENT_DATE> =当月日期和结束日期PARAM当月=最后日期起计15则开始日期参数= 1

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

我能在电子计算日期但无法弄清楚:

#1)如何把它们放在参数中。如果我可以把它们放在PARAMS那么我需要做的就是

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

OR #2)写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 

请指导如何实现#1或#2。我无法在teradata中创建函数或存储过程

+0

您的专栏是否真的名为'日期'?如果是这样,你必须把它放在双引号中。不知道它是否会这样工作,或与实际日期比较。 – ULick

+0

不,它没有命名为'日期',但是它是日期字段 – SilverFish

回答

0

#2以日历为例。

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 
    ; 

我喜欢current_date,不能与数据类型相混淆。

+0

如果我们谈论性能,将上面的选择放入易失性表并将其加入到您的视图中可能会有好处。 – ULick

+0

@ULICK,工作!谢谢 – 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