2017-06-20 57 views
0

我想创建复杂类型的AWS UDF功能。 AWS UDF正文部分支持Python语言。我已经在Python中创建了这个函数的正文部分功能。但是,我在AWS Redshift上运行以下代码,并收到错误消息。我可以创建复杂类型的AWS Redshift UDF

create or replace function Date(EffDt varchar,EffDt varchar) 
    RETURNS VARCHAR STABLE AS $$ 
    from dateutil.parser import parse 
    import datetime 
    from datetime import timedelta 
    if len(EffDt)>0 and len(Pay)>0: 
     dt=parse(EffDt) 
     if dt.month and dt.day==1: 
      NewDate=dt 
     else: 
      if Pay=="Weekely": 
        value=datetime.date(dt.year, dt.month, dt.day).weekday() 
        if value==1: 
         NewDate= dt + timedelta(days=1) 
        elif value==2: 
         NewDate = dt 
        elif value==3: 
        NewDate=dt+timedelta(days=6) 
        elif value==4: 
         NewDate=dt+timedelta(days=5) 
        elif value==5: 
        NewDate=dt+timedelta(days=4) 
        elif value==6: 
        NewDate=dt+timedelta(days=3) 
        elif value==7: 
        NewDate=dt+timedelta(days=2) 
        else : 
        pass 
      if Pay=="Monthly": 
       strvalue=dt.strftime('%Y/%m/%d') 
       if strvalue[:2]=="15": 
       strDate=str(dt.month)+"/16/"+str(dt.year) 
       NewDate=parse(strDate) 
       elif strvalue[:3]=="01": 
       NewDate=dt 
       else : 
       strDate=str(dt.month+1)+"/01/"+str(dt.year) 
       NewDate=parse(strDate) 
    else : 
     NewDateValue="1/1/1990" 
     NewDate=parse(NewDateValue) 
    mm=NewDate.month 
    yyyy=NewDate.year 
    print(yyyy) 
    if len(str(mm))==1: 
     mm="0"+str(mm) 
    dd=NewDate.day 
    if len(str(dd))==1: 
     dd="0"+str(dd) 
    _date=str(yyyy) +str(mm)+str(dd) 
    return _date 
$$ LANGUAGE plpythonu; 
+0

有什么错误? – Ray

+0

消息 错误:XX000:无法编译udf。 – raj

回答

0

我已经解决了我这个problem.Following代码工作

CREATE OR REPLACE FUNCTION abc(EffDt character varying, Pay character varying) 
RETURNS character varying AS 

def payDate(EffDt,Pay): 
    from dateutil.parser import parse 
    import datetime 
    from datetime import timedelta 
    if len(EffDt)>0 and len(Pay)>0: 
     dt=parse(EffDt) 
     if dt.month and dt.day==1: 
      print(dt.month) 
      print(dt.day) 
      NewDate=dt 
     else: 
      if Pay=="Weekely": 
        value=datetime.date(dt.year, dt.month, dt.day).weekday() 
        print(value) 
        if value==1: 
         NewDate= dt + timedelta(days=1) 
        elif value==2: 
         NewDate = dt 
        elif value==3: 
        NewDate=dt+timedelta(days=6) 
        print(NewDate) 
        elif value==4: 
         NewDate=dt+timedelta(days=5) 
        elif value==5: 
        NewDate=dt+timedelta(days=4) 
        elif value==6: 
        NewDate=dt+timedelta(days=3) 
        elif value==7: 
        NewDate=dt+timedelta(days=2) 
        else : 
        pass 
      if Pay=="Monthly": 
       strvalue=dt.strftime(''%Y/%m/%d'') 
       if strvalue[:2]=="15": 
       strDate=str(dt.month)+"/16/"+str(dt.year) 
       NewDate=parse(strDate) 
       elif strvalue[:3]=="01": 
       NewDate=dt 
       else : 
       strDate=str(dt.month+1)+"/01/"+str(dt.year) 
       NewDate=parse(strDate) 
       print(NewDate) 

    else : 
     NewDateValue="1/1/1990" 
     NewDate=parse(NewDateValue) 


    mm=NewDate.month 
    yyyy=NewDate.year 
    print(yyyy) 
    if len(str(mm))==1: 
     mm="0"+str(mm) 
    dd=NewDate.day 
    if len(str(dd))==1: 
     dd="0"+str(dd) 
    _date=str(yyyy) +str(mm)+str(dd) 
    print(yyyy) 
    print(mm) 
    print(dd) 
    return _date 

return payDate(EffDt, Pay) 
LANGUAGE plpythonu STABLE; 
+0

,这是什么问题? –

+0

在帖子提问时缺少def payDate()函数 – raj