今天在做的时候碰到,如果一个字符串是日期时间类型,但是他的这种形式是错误的,就比如:2019-02-31
我们都知道2月份是没有31号的,所以我们要给日期附一个默认值。或者因为数据库当中的使用了varchar的类型随心所欲的乱写
各种各样的数据都有。这对于数据清洗是一件非常麻烦的事情。所以我们写一个函数,对于这种的如果是日期的就正常返回日期,如果不是的话就返回
一个默认的日期给他。redshift的自定义函数的形式如下:
--判断是不是时间戳,返回数据 CREATE or replace FUNCTION f_py_is_valid_timestamp (a varchar) RETURNS varchar IMMUTABLE as $$ import time from datetime import datetime def is_valid_timestamp(strdate): try: if ":" in strdate: if(len(strdate)==23): return str((datetime.strptime(strdate, '%Y-%m-%d %H:%M:%S.%f'))) else: return str((datetime.strptime(strdate, '%Y-%m-%d %H:%M:%S'))) elif(len(strdate)==13): s2 = round(int(strdate)/ 1000 - 28800) timeArray = time.localtime(s2) return str(time.strftime("%Y-%m-%d %H:%M:%S", timeArray)) elif (len(strdate) == 14): b = '%s-%s-%s %s:%s:%s' % (strdate[0:4], strdate[4:6], strdate[6:8], strdate[8:10], strdate[10:12], strdate[12:16]) return str(datetime.strptime(b, '%Y-%m-%d %H:%M:%S')) except Exception: return '1900-01-01 00:00:00' return is_valid_timestamp(a) $$ LANGUAGE plpythonu;
上面自定义的udf当中,我们采用的Python脚本的形式自定义的函数。在两个$符号的中间就是一段Python代码。写好这个之后就在可以在redshift的客户端界面执行以下这个函数
需要注意的问题:
(1)自定义函数当行Python的换行和空格符号(一定要注意否则一直报错)
(2)在用Python写好函数之后一定要与返回值 return is_valid_timestamp(a) 这样函数才会起作用
(3)创建的这个自定义的函数其实是以存储过程的形式存在,在创建这个函数的时候也可以指定函数创建的库名字。如下:
CREATE or replace FUNCTION 数据库库名字.f_py_is_valid_timestamp (a varchar) RETURNS varchar
至此redshift的自定义函数就设置好了。