IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Trigger testant un intervalle de temps


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut Trigger testant un intervalle de temps
    Bonjour à tous,

    Je me permets de poster ici car je débute en pl/sql et je sèche sur la conception d'un trigger avec l'utilisation d'un intervalle day to second.

    Je possède deux timestamp correspondant a une date et heure de debut de représentation et de fin de représentation (d'un groupe dans une rencontre) que j'aimerai comparer et afficher un message d'erreur si la durée minimum de passage est inférieure a 300 secondes.
    Dois je transformer ces deux valeurs en numérique auparavant?

    J'ai un code qui est plus qu'expérimental, je me doute
    J'aimerai qu'on m'explique comment m'y prendre pour utiliser cette fonction si cela est possible car cela reste completement flou pour moi meme apres des recherches.

    Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    set serveroutput on
    create or replace trigger diff_debut_et_fin
    before insert or update on participe
    for each row
    declare
    intervalle interval day to second
    diff varchar2 (10)
    begin
    intervalle:= to_dsinterval(300,second);
    diff:=(:new.dateethfingroupe - :new.dateethdebgroupe);
    if diff < intervalle then
    raise_application_error (-2000,'Erreur, la duree de passage est inferieure a 5 minutes');
    end if;
    end;
    /

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Une solution différente qui ramene au meme resultat!
    Cependant, si quelqu'un peut faire la meme avec l'utilisation d'un interval day to second je suis preneuse


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    create or replace trigger duree_mini_pass
    before insert or update on participe
    for each row
    declare
    minutes number (2);
    heures number (2);
    jours number (2);
    intervalle number (2);
    begin
    intervalle:=5;
    minutes:=extract(minute from (:new.dateethfingroupe-:new.dateethdebgroupe));
    heures:=extract(hour from (:new.dateethfingroupe-:new.dateethdebgroupe));
    jours:=extract(day from (:new.dateethfingroupe-:new.dateethdebgroupe));
    if (jours <=0)
    then if (heures <=0)
    then if (intervalle>minutes)
    then
    raise_application_error (-2012,'La duree mini de passage du groupe doit etre de 5 minutes');
    end if;
    end if;
    end if;
    end;
    /

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Merci d'éditer tes posts et de mettre les balises Code (c'est l'icône #), ce sera plus lisible.

    Sinon, le plus simple est de tester simplement la différence de 2 dates qui te donne un nombre de jour (avec les décimales qui te permettent d'arriver à la seconde)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    diff := :new.dateethfingroupe - :new.dateethdebgroupe;
    -- 24 heures x 60 minutes par heure 
    IF diff < 5 / 24 / 60 THEN
    raise_application_error (-2012,'La duree mini de passage du groupe doit etre de 5 minutes');
    END IF;

  4. #4
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Je suis d'accord avec MCM, pour ce genre de besoin un type DATE serait plus adapté qu'un type TIMESTAMP.
    En effet, une différence entre 2 DATE fournit un nombre (représentant un nombre décimal de jours), alors qu'une différence entre 2 TIMESTAMP fournit un intervalle. Et pour convertir ce dernier en secondes, c'est un peu lourdingue.

    Si on ne veut pas remettre en cause le type TIMESTAMP, le plus efficace à mes yeux est de convertir le TIMESTAMP en DATE, à l'aide de CAST qui rend transparentes toutes les problématiques de formatage.
    La suite ne pose plus de problème.

    Vous pouvez exécuter le code suivant 2 ou 3 fois pour voir ce que ça donne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    set serveroutput on
    declare
    	debut 	timestamp	:=sysdate - trunc(dbms_random.value/100, 4);
    	fin	timestamp	:=sysdate;
    	diff	number(15);
    	seuil	int		:=300; -- en secondes
    begin
    	diff:=(cast(fin as date)-cast(debut as date)) *24*60*60;
    	dbms_output.put_line('début : ' || debut);
    	dbms_output.put_line('fin : ' || fin);
    	dbms_output.put_line('différence en secondes : ' ||diff);
    	if diff < seuil then
    		dbms_output.put_line('la durée est inférieure à ' || seuil || ' secondes');
    	end if;
    end;
    /

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    To_DSInterval
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    SQL> With data As (
      2   Select systimestamp deb, systimestamp + interval '0 00:05:00' day to second fin from dual union all
      3   Select systimestamp deb, systimestamp + interval '0 00:07:00' day to second fin from dual union all
      4   Select systimestamp deb, systimestamp + interval '0 00:02:00' day to second fin from dual
      5  )
      6  select deb, fin, case when fin - deb < interval '0 00:05:00' day to second then 1 else 0 end method1 ,
      7                   case when fin - deb < to_dsinterval('0 00:05:00') then 1 else 0 end method2
      8    from data
      9  /
     
    DEB                                               FIN                                                  METHOD1    METHOD2
    ------------------------------------------------- ------------------------------------------------- ---------- ----------
    12/08/10 14:48:15,162268 -01:00                   12/08/10 14:53:15,162268000 -01:00                         0          0
    12/08/10 14:48:15,162268 -01:00                   12/08/10 14:55:15,162268000 -01:00                         0          0
    12/08/10 14:48:15,162268 -01:00                   12/08/10 14:50:15,162268000 -01:00                         1          1
     
    SQL>

  6. #6
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Citation Envoyé par mnitu Voir le message
    ...
    select deb, fin, case when fin - deb < interval '0 00:05:00' day to second then else 0 end method1 ,
    case when fin - deb < to_dsinterval('0 00:05:00') then 1 else 0 end method2
    from data
    /
    Eh oui, bien vu !!

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    En fait je pense qu'on cherche à utiliser numtodsinterval(300,'second') et non pas to_dsinterval.

Discussions similaires

  1. [9i] Calculer des intervalles de temps
    Par tscoops dans le forum Oracle
    Réponses: 9
    Dernier message: 31/12/2005, 08h38
  2. [debutant] Récupérer un intervalle de temps
    Par xlurp dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 28/10/2004, 15h48
  3. [Interbase 6]Stocker l'intervalle de temps
    Par Andry dans le forum InterBase
    Réponses: 4
    Dernier message: 11/08/2004, 07h48
  4. [Timer]Comment mesurer un intervalle de temps ?
    Par Pill_S dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/05/2004, 17h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo