Vous n'êtes pas identifié(e).
Pages : 1
Bonjour tout le monde,
cela faisait un petit bout de temps que je n'étais pas venu vous voir, mais pendant ce temps j'ai continué à développer des petits trigger, et aujourd'hui, je bloque sur un trigger qui modifierait une suite de caractères au format timestamp without time zone.
cette suite de caractères (champ_source) est constitué de la sorte ex. : 29/01/2001
Pour ça, j'ai trouvé la fonction : to_timestamp(champ_source,'DD/MM/YYYY')
qui modifie correctement le format.
L'idée ça serait évidemment qu'à l'insertion de ces caractères dans la table ils se mettent en auto au bon format.
Alors pour le moemnt j'ai développé ça :
CREATE OR REPLACE FUNCTION update_char2date()
RETURNS "trigger" AS $date$
BEGIN
NEW.date_referentiel=to_timestamp(NEW.date_referentiel,'DD/MM/YYYY');
NEW.date_acquisition=to_timestamp(NEW.date_acquisition,'DD/MM/YYYY');
RETURN NEW;
END;
$date$
LANGUAGE 'plpgsql';
ALTER FUNCTION update_char2date() OWNER TO postgres;
CREATE TRIGGER update_char2date BEFORE INSERT OR UPDATE
ON table FOR EACH ROW
EXECUTE PROCEDURE update_char2date();
Mais ça ne fonctionne pas...pourtant l'enthousiasme y était...
auriez-vous une idée pour me dépatouiller de cette problématique, ou bien il est impossible d'insérer du caractère dans une colonne définit en timestamp, donc le problème doit se résoudre en amont?!
Merci d'avance.
Hors ligne
Que veut dire « ça ne fonctionne pas » ? vous avez une erreur ? si oui, laquelle ? de plus, comment est définie la table ?
Guillaume.
Hors ligne
Alors je vais commencer par la table qui contient des champs définis en 'timestamp without time zone'
Je fais une intégration dans ma BDD via un logiciel de SIG de dates au format 'DD/MM/YYYY'
Mais quand je tente l'intégration avec mon trigger en route, voici ce que j'obtiens :
Une erreur s'est produite :
ERROR: function to_timestamp(timestamp without time zone, unknown) does not exist
LIGNE 1 : SELECT to_timestamp( $1 ,'DD/MM/YYYY')
^
ASTUCE : No function matches the given name and argument types. You might need to add explicit type casts.
REQUÊTE : SELECT to_timestamp( $1 ,'DD/MM/YYYY')
CONTEXTE : PL/pgSQL function "update_char2date" line 3 at assignment
Hors ligne
Il faut fournir une donnée de type text pour le premier argument de la fonction to_timestamp. Or, là, votre colonne est de type timestamp without timezone. Donc commencez par convertir en text de cette façon :
NEW.date_referentiel=to_timestamp(NEW.date_referentiel::text,'DD/MM/YYYY');
Mais en fait, je ne vois pas ce que vous cherchez à obtenir. Vous allez modifier une valeur de type timestamp en la même valeur de type timestamp. Quel est l'intérêt ?
Guillaume.
Hors ligne
Je vois où vous voulez en venir, mais j'ai le sentiment que ce n'est pas la bonne approche.
Voyez d'abord la section 8.5.1 de la doc: http://www.postgresql.org/docs/8.4/stat … etime.html
PostgreSQL devrait décoder de lui même une date de la forme DD/MM/YYYY. Il faudra néanmoins d'assurer que le paramètre datestyle soit positionné à 'iso, dmy' ou 'sql, dmy' (dans le postgresql.conf, ou dans la session avec SET datestyle='sql, dmy';). Vous devriez vous économiser un trigger.
Pour info:
postgres=# CREATE TABLE test (date_referentiel DATE);
postgres=# SHOW datestyle ;
DateStyle
-----------
ISO, DMY
(1 ligne)
postgres=# INSERT INTO test (date_referentiel) VALUES ('21/09/2011');
INSERT 0 1
postgres=# SELECT * FROM test;
date_referentiel
------------------
2011-09-21
(1 ligne)
Thomas Reiss
Hors ligne
C'est exactement ce que je voulais faire frost242!
mais je ne connaissais pas du tout cette variable datestyle, qui est quand même très importante.
Tout marche niquel, merci pour l'aide et pour la petite démo ;-)
bonne journée.
Hors ligne
Ah super ! De rien, c'est avec plaisir.
Thomas Reiss
Hors ligne
Pages : 1