ОШИБКА: XX000: ValueError: Ожидается объект datetime.Пожалуйста, посмотрите на svl_udf_log для получения дополнительной информации - PullRequest
0 голосов
/ 24 апреля 2019

Я создал UDF Python в красном смещении для проверки, имеют ли мои данные правильные записи даты (если не возвращают NULL).

UDF успешно создан, но когда я передаю значение для функции, возникает ошибка его выдачи.

Python-код работает нормально в Google colab.Но не в красном смещении

CREATE OR REPLACE FUNCTION public.fn_isdate(date_text character varying)
  RETURNS timestamp  without time zone
stable
as $$
import datetime
def validate(dt):
    try:
        ti = datetime.datetime.strptime(dt,'%m/%d/%Y')
        return ti.strftime('%m/%d/%Y')
    except TypeError:
        return None
    except ValueError:
        try:
            ti = datetime.datetime.strptime(dt, '%Y-%m-%d')
            return ti.strftime('%m/%d/%Y')
        except ValueError:
            return None   
return validate(date_text)
$$ language plpythonu;

Я ожидаю 12/22/2003 для этого - SELECT public.fn_isdate('2003-12-22'); и NULL для этого - SELECT public.fn_isdate('03-12-22');

1 Ответ

0 голосов
/ 25 апреля 2019

Вы объявляете вашу функцию как возвращающую timestamp without time zone, а затем вы возвращаете питона string.Не преобразование даты в строку делает трюк:

CREATE OR REPLACE FUNCTION sbochniak.fn_isdate(date_text character varying)
  RETURNS timestamp  without time zone
  stable
as $$
import datetime
def validate(dt):
    try:
        ti = datetime.datetime.strptime(dt,'%m/%d/%Y')
        return ti
    except TypeError:
        return None
    except ValueError:
        try:
            ti = datetime.datetime.strptime(dt, '%Y-%m-%d')
            return ti
        except ValueError:
            return None
return validate(date_text)
$$ language plpythonu;

Тогда:

SELECT
   sbochniak.fn_isdate('2003-12-22') as a,
   sbochniak.fn_isdate('03-12-22') as b;

возвращает:

a                           b
2003-12-22 00:00:00.000000  <NULL>
...