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

MS SQL Server Discussion :

Probleme sur une fonction


Sujet :

MS SQL Server

  1. #1
    Membre habitué Avatar de Poisson59
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 213
    Points : 140
    Points
    140
    Par défaut Probleme sur une fonction
    Bonjour,

    J'ai créé une fonction à l'aide de certaine personnes sur ce forum

    la voici :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    CREATE FUNCTION datediff_ouvre
    (
    @F_DATE AS datetime,
    @L_DATE AS datetime
    )
    returns integer
    AS
    begin
    Declare @NB integer
    Declare @SEC integer
    Declare @SEC_DEB integer
    Declare @SEC_FIN integer
    Declare @F_DATE_T datetime
    Declare @L_DATE_T datetime
     
    SET @F_DATE_T = dateadd(day,0,convert(varchar,@F_DATE,103)) -- Enleve les heures
    SET @L_DATE_T = dateadd(day,0,convert(varchar,@L_DATE,103)) -- Enleve les heures
     
    SET @SEC_DEB = datediff(second,@F_DATE,dateadd(hour,19,@F_DATE_T))
    SET @SEC_FIN = datediff(second,dateadd(hour,8,@L_DATE_T),@L_DATE)
    SET @NB = 0
     
    while datediff(dd, @F_DATE_T,@L_DATE_T) > 0
    BEGIN
    		IF datepart(dw, @F_DATE_T) NOT IN (6,7)
    			SET @NB = @NB + 1
    		SET @F_DATE_T = dateadd(dd,1,@F_DATE_T)
    END
    IF @NB > 0
    	SET @NB = @NB - 1
     
    SET @NB = @NB*39600
     
    If datediff(dd, @F_DATE_T,@L_DATE_T) = 0
    		SET @SEC = datediff(second,@F_DATE,@L_DATE)
     
    IF datediff(dd, @F_DATE_T,@L_DATE_T) <> 0
    		SET @SEC = @NB + @SEC_DEB + @SEC_FIN
     
    RETURN @SEC
    le résultat retourné ne correspond pas a ce que je veux pourtant quand je teste séparément les variables @NB, @SEC_DEB et @SEC_FIN j'ai bien ce que je veux

    Exemple quand je teste séparément :
    @NB me retourne 118800
    @SEC_DEB me retourne 38050
    @SEC_FIN me retourne 24111

    mais @SEC qui est @NB + @SEC_DEB + @SEC_FIN ne me retourne pas 180961

    Et si je remplace "RETURN @SEC" par "RETURN @NB + @SEC_DEB + @SEC_FIN" ca marche. Mais j'ai vraiment besoin de @SEC parce que c'est le résultat d'un IF

    Et là je ne comprends plus ???

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Citation Envoyé par Poisson59
    Bonjour,
    ...
    ...
    Et là je ne comprends plus ???
    salut,

    tiens c'est marrant je reconnais un bout de code

    Bon, y'a un truc qui a dû t'echapper :
    A la sortie de la boucle WHILE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while datediff(dd, @F_DATE_T,@L_DATE_T) > 0
    BEGIN
    		IF datepart(dw, @F_DATE_T) NOT IN (6,7)
    			SET @NB = @NB + 1
    		SET @F_DATE_T = dateadd(dd,1,@F_DATE_T)
    END
    @F_DATE_T et @LDATE_T ont la même valeur DD/MM/YYYY (pas forcément même hh/mm/ss) mais c'est pas ce qu'on teste.


    Or derrière tu testes ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If datediff(dd, @F_DATE_T,@L_DATE_T) = 0
    		SET @SEC = datediff(second,@F_DATE,@L_DATE)
     
    IF datediff(dd, @F_DATE_T,@L_DATE_T) <> 0
    		SET @SEC = @NB + @SEC_DEB + @SEC_FIN
    ce qui ne sert à rien puisque tu passeras toujours dans ton premier test. Et oui, encore une fois, ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If datediff(dd, @F_DATE_T,@L_DATE_T) = 0
    est toujours vrai.

    Donc SEC vaut toujours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    datediff(second,@F_DATE,@L_DATE)
    Sinon une question : à quoi ca te sert au début de la proc "d'enlever" les heures ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @F_DATE_T = dateadd(day,0,convert(varchar,@F_DATE,103)) -- Enleve les heures
    SET @L_DATE_T = dateadd(day,0,convert(varchar,@L_DATE,103)) -- Enleve les heures
    En plus entre nous tu n'enlèves rien..

    En clair, que veux-tu faire au final ?

  3. #3
    Membre habitué Avatar de Poisson59
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 213
    Points : 140
    Points
    140
    Par défaut
    Voilà l'explication

    Je travail dans un centre d'appel et on recoit des appels à toutes heures mais pour refleter notre activité on se base sur des journée de 08h00 à 19h00 (soit 11h) et du lundi au vendredi.

    on créér un appel puis on le clos donc on veux calculer le délai entre création (F_date) et cloture (L_date)

    F_date et L_date on le format jj/mm/aaaa hh:mm:ss

    @NB = nombre de jour plein entre F_date et L_date
    exemple 01/08/2006 et 03/08/2006 = 1 jour plein (le 02/08/2006)


    exemple avec cloture le jour même
    un simple datediff(second,F_date,L_date) là les dates sont testé sans les heures

    exemple avec cloture le landemain :
    entre 01/08/2006 11:45 et 02/08/2006 15:25
    donc nombre de seconde entre 01/08/2006 11:45 et 01/08/2006 19:00
    + nbre seconde entre 02/08/2006 08:00 et 02/08/2006 15:25

    Exemple avec cloture apres demain
    entre 01/08/2006 11:45 et 05/08/2006 15:25
    donc nombre de seconde entre 01/08/2006 11:45 et 01/08/2006 19:00
    + nbre seconde entre 05/08/2006 08:00 et 05/08/2006 15:25
    + 3 * 11h * 3600

    As tu compris ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Re,

    oui c'est clair.
    Mais avant que je puisse te donner un truc à faire (qui en fait est tout bête ) peux-tu me dire ce que tu fais des appels reçus avant 8h et après 19h ? Tu "forces" l'heure à 8h ou 19h ?

  5. #5
    Membre habitué Avatar de Poisson59
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 213
    Points : 140
    Points
    140
    Par défaut
    en faite NORMALEMENT y'en a pas mais sinon j'ai créér un colonne qui gére ce cas de problème
    qui force à 8h00 quand c'est < à 8 heures
    et une qui force à 8h00 le lendemain quand c'est > 19h (c'est pareil)

  6. #6
    Membre habitué Avatar de Poisson59
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 213
    Points : 140
    Points
    140
    Par défaut
    Ca y est j'ai trouvé mon erreur , je n'ai pas réinitialiser mes variable F_date_T et L_date_T avant ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    IF datediff(dd, @F_DATE_T,@L_DATE_T) = 0
    		SET @SEC = datediff(second,@F_DATE,@L_DATE)
     
    IF datediff(dd, @F_DATE_T,@L_DATE_T) <> 0
    		SET @SEC = @NB + @SEC_DEB + @SEC_FIN
    forcement quand je sortait du While mes deux variable était focement égale

    voici le code de la function corrigé

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     
    CREATE FUNCTION datediff_ouvre
    (
    @F_DATE AS datetime,
    @L_DATE AS datetime
    )
    returns integer
    AS
    begin
    Declare @NB integer
    Declare @SEC integer
    Declare @SEC_DEB integer
    Declare @SEC_FIN integer
    Declare @F_DATE_T datetime
    Declare @L_DATE_T datetime
     
     
    SET @F_DATE_T = dateadd(day,0,convert(varchar,@F_DATE,103)) -- Enlève les heures à @F_DATE
    SET @L_DATE_T = dateadd(day,0,convert(varchar,@L_DATE,103)) -- Enlève les heures à @L_DATE
    SET @SEC_DEB = datediff(second,@F_DATE,dateadd(hour,19,@F_DATE_T))
    SET @SEC_FIN = datediff(second,dateadd(hour,8,@L_DATE_T),@L_DATE)
    SET @NB = 0
     
     
    while @F_DATE_T != @L_DATE_T 
    BEGIN
    		IF datepart(dw, @F_DATE_T) NOT IN (6,7)
    			SET @NB = @NB + 1
    		SET @F_DATE_T = dateadd(dd,1,@F_DATE_T)
    END
    IF @NB > 0
    	SET @NB = @NB - 1
     
    -- Réinitialisation des variables  
    SET @F_DATE_T = dateadd(day,0,convert(varchar,@F_DATE,103)) 
    SET @L_DATE_T = dateadd(day,0,convert(varchar,@L_DATE,103)) 
     
    If @F_DATE_T = @L_DATE_T
    		SET @SEC = datediff(second,@F_DATE,@L_DATE)
    Else
    		SET @SEC = @NB*39600 + @SEC_DEB + @SEC_FIN
     
     
    RETURN @SEC
    end

    Merci à toi ZERS !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. demande de conseille pour un probleme sur une fonction
    Par pierre-y dans le forum Général Python
    Réponses: 4
    Dernier message: 19/12/2012, 11h34
  2. Probleme sur une fonction
    Par phoenix345 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 17/10/2010, 18h54
  3. Probleme sur une fonction
    Par dederfred dans le forum Delphi
    Réponses: 1
    Dernier message: 06/10/2006, 16h58
  4. Probleme sur une fonction vérif
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/10/2004, 13h25
  5. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26

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