#postgresql #function #triggers
Вопрос:
У меня есть скрипт, который вставит данные в таблицу postgres проблема в том, что данные имеют формат даты ДД/ММ/ГГГГ, и этот стиль даты не принят — я не могу изменить стиль даты, так как это длится только сеанс ( это то, что я читал). У меня есть эта функция и триггер для изменения формата даты, но я получаю значение поля даты/времени ошибки вне диапазона: «ДД/ММ/ГГГГ» может ли кто-нибудь помочь в том, что не так с функцией/триггером, чтобы формат даты заработал Я попробовал несколько итераций этого, и все они дают одну и ту же ошибку
CREATE OR REPLACE FUNCTION format_date()
RETURNS TRIGGER
LANGUAGE plpgsql
AS
$
BEGIN
NEW.Invoice_Date = to_char(NEW.Invoice_Date, 'YYYY-MM-DD')::date;
NEW.Due_Date = to_char(NEW.Due_Date, 'YYYY-MM-DD')::date;
NEW.Paid_Date = to_char(NEW.Paid_Date, 'YYYY-MM-DD')::date;
RETURN NEW ;
END;
$
CREATE TRIGGER format_date
BEFORE INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE format_date();
Я пробовал использовать to_date с новым и без него. в пределах to_char, и я попытался заставить его назначить дату ::дата в столбце. Любая помощь будет очень признательна
Комментарии:
1. Если входящие даты будут всегда
DD/MM/YYYY
, вы можете изменитьDateStyle
их в postgresql.conf и сделать их «постоянными».to_char(NEW.Invoice_Date, 'YYYY-MM-DD')::date;
Вероятно, это должно бытьto_date(NEW.Invoice_Date, 'DD/MM/YYYY)::date;
2. Я пытаюсь избежать изменения postgresql.conf, поэтому пытаюсь изменить формат даты
3. Хорошо, если все даты не будут представлены в виде
DD/MM/YYYY
отформатированных строк, ваш триггер не сработает. Если все они поступят так же, какDD/MM/YYYY
и тогдаpostgresql.conf
, изменение сэкономит вам много работы. Есть ли у вас контроль над тем, как они форматируются до их поступления в базу данных?4. Нет контроля над тем, как они поступают. Я просто знаю, что предпочтительным методом будет тот, при котором изменения в postgresql.conf не требуются
5. Вам не нужно ничего менять
postgresql.conf
, вы можете изменить это для каждого пользователяalter user ... set datestyle = '...'
;`