Vous n'êtes pas identifié(e).

#1 20/09/2011 15:17:49

Geo-x
Membre

trigger character 'DD/MM/YYYY' to timestamp

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

#2 20/09/2011 17:13:45

gleu
Administrateur

Re : trigger character 'DD/MM/YYYY' to timestamp

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

#3 21/09/2011 08:59:42

Geo-x
Membre

Re : trigger character 'DD/MM/YYYY' to timestamp

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

#4 21/09/2011 09:26:41

gleu
Administrateur

Re : trigger character 'DD/MM/YYYY' to timestamp

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

#5 21/09/2011 10:20:26

frost242
Administrateur

Re : trigger character 'DD/MM/YYYY' to timestamp

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

#6 21/09/2011 11:59:56

Geo-x
Membre

Re : trigger character 'DD/MM/YYYY' to timestamp

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

#7 21/09/2011 13:46:44

frost242
Administrateur

Re : trigger character 'DD/MM/YYYY' to timestamp

Ah super ! De rien, c'est avec plaisir.


Thomas Reiss

Hors ligne

Pied de page des forums