Почему мой Python UDF возвращает пустой вывод в красное смещение? - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть таблица со столбцом, содержащим значения даты и времени в различных форматах - с миллисекундами, без миллисекунд, с нулевым заполнением, без нулевого заполнения. Мне нужно использовать эти данные для расчета временных интервалов. Итак, я написал функцию UDF для Python и попытался вызвать это в своем запросе. Но я получаю пустые значения при вызове таблицы и ошибку при вызове со строкой. Моя функция 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. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Это работает для меня, измените при необходимости. Не уверен точно что с тобой не так.

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
0 голосов
/ 26 апреля 2018

В

validateDate('2018-04-19 09:29:52 +1000')

строка по какой-то причине не распознается как varchar (возможно, отображение типов данных между SQL и Python). Попробуйте указать тип данных явно, чтобы избежать этой проблемы

validateDate('2018-04-19 09:29:52 +1000'::varchar)

В запросе вы используете функцию для datetime, похоже, что она принимает datetime в качестве параметра varchar, но код выдает исключение и заканчивается на строке pass, возвращая ноль. Попробуйте сделать то же самое со вторым запросом (добавьте ::varchar)

...