我有一个包含一个包含不同格式的日期时间值的列的表 - 毫秒,没有毫秒,零填充,没有零填充。 我需要使用该数据来计算时间间隔。所以,我编写了一个python UDF函数,并尝试在我的查询中调用它。但是当在表上调用时我得到空值并且在用字符串调用时出错。 我的UDF功能是:
create or replace function everyonesdb.validateDate(tzDate varChar)
returns varchar
stable
as $$
from datetime import datetime
try:
return datetime.strftime(datetime.strptime(tzDate,'%Y-%m-%d %H:%M:%S:%f %z'),'%Y-%m-%d %H:%M:%S %z')
except ValueError:
pass
$$ language plpythonu;
我这样称呼它:
Select validateDate('2018-04-19 09:29:52 +1000')
我收到错误:
[Amazon](500310) Invalid operation: function validatedate("unknown") is not unique;
我也在我的查询中尝试过。有了这个,我就得到空值。
SELECT DISTINCT date_time_tz,
validateDate(date_time_tz) from table1
O / P:
date_time_tz validatedate
2018-04-19 12:37:33:359 +0800
2018-04-19 10:23:27:492 +1000
2018-04-19 11:02:58:810 +1000
2018-04-19 09:39:42:820 +1000
2018-04-19 10:30:18:017 +0530
2018-04-19 16:14:49:581 +1000
这是我第一次尝试使用Python UDF。任何帮助将不胜感激。
答案 0 :(得分:0)
在
validateDate('2018-04-19 09:29:52 +1000')
由于某种原因(可能是SQL和Python之间的数据类型的映射),字符串无法识别为varchar。尝试明确指定数据类型以避免该问题
validateDate('2018-04-19 09:29:52 +1000'::varchar)
在查询中,您使用datetime上的函数,看起来它接受datetime作为varchar参数,但代码抛出异常并在pass
行结束,返回null。尝试对第二个查询执行相同操作(添加::varchar
)
答案 1 :(得分:0)
这对我有用,可根据需要进行修改。不确定完全你的错误。
CREATE OR REPLACE FUNCTION f_validate_date(tz_date VARCHAR(50))
RETURNS TIMESTAMP
STABLE
AS $$
if tz_date is None:
return None
else:
from datetime import datetime
dtm = datetime.strptime(tz_date,'%Y-%m-%d %H:%M:%S:%f')
return dtm
$$ LANGUAGE plpythonu
;
结果
SELECT f_validate_date('2018-05-01 18:18:00:000');
f_validate_date
---------------------
2018-05-01 18:18:00
或者你可以用老式的方式做到这一点。它更快,但不像分号毫秒分隔符。
SELECT '2018-05-01 18:18:00.000'::TIMESTAMP;
timestamp
---------------------
2018-05-01 18:18:00
--Leading zeroes
SELECT '0002018-05-01 18:18:00.000'::TIMESTAMP;
timestamp
---------------------
2018-05-01 18:18:00