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

Développement SQL Server Discussion :

calculer une difference de temps avec des dates qui ne sont pas dans le même row


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut calculer une difference de temps avec des dates qui ne sont pas dans le même row
    bonjour,
    Je dois trouver la différence de temps entre le moment ou un ticket est mis en Suspended (1 ligne) et le moment ou il change d'état (autre ligne) et quitte le statut de suspended
    j'ai une view comme ceci :

    Newvalue oldvalue incidentnumber Date
    Suspended Open 194094 6/04/2012 9:12
    Solved Suspended 195932 6/01/2012 9:26
    Suspended Open 197688 15/06/2012 9:35
    Solved Suspended 197688 18/06/2012 3:21
    Open Suspended 184952 6/04/2012 8:46
    Suspended Open 196449 6/04/2012 11:12
    Solved Suspended 196449 6/04/2012 13:57
    Suspended Open 197529 6/11/2012 16:51
    Open Suspended 197529 6/12/2012 6:50
    Suspended Open 197529 6/12/2012 16:57
    Solved Suspended 197529 13/06/2012 11:26

    Comment m'y prendre ? Sachant que le critère commun pour trouver l'ouverture du statut et sa fermeture est IncidentNumber, qu'il peut y avoir plusieurs ouvertures et fermetures sur un même ticket (Incidentnumber).
    J'ai commencé une query, dans laquelle je n'ai pas encore calculé la différence de temps, mais simplement pour trouver la ligne correspondant à la fermeture du Statut par rapport à IncidentNumber. suis-je dans la bonne direction ou non ?

    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
    ------------------- 
    Sous SQL Server 2008 
    ------------------- 
    DECLARE @IncidentNumber INT, @CreatedDate DATETIME, @CloseDate DATETIME; 
     
    --SET @LastDateChange = GETDATE() 
     
    DECLARE myCursor CURSOR FOR 
     
    SELECT IncidentNumber, CreatedDateTime 
    FROM dbo.v_Sel_Suspended 
    WHERE NewFieldValue = 'Suspended' 
     
    OPEN myCursor 
    FETCH NEXT FROM myCursor 
    INTO @IncidentNumber, @CreatedDate 
     
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     
    SET @CloseDate = (SELECT Min(CreatedDateTime) FROM dbo.v_Sel_Suspended WHERE OldFieldValue = 'Suspended'
     AND IncidentNumber = @IncidentNumber AND CreatedDateTime> @CreatedDate) 
     
    FETCH NEXT FROM myCursor 
    INTO @IncidentNumber, @CreatedDate 
     
    END 
    CLOSE myCursor 
    DEALLOCATE myCursor
    Bien sur ce n'est qu'une ébauche. L'idée étant ensuite de calculer le nombre d'H de différence entre la createdDateTime et la variable @ClosedDate, et de mettre ensuite IncidentNumber et le nbre d'heure dans une table (en tenant compte de l'incrémebtation du nbre d'heures si le ticket revient plusieurs fois en statut Suspended) et aussi quand il y a seulement ouverture et non fermeture (pour l'instant mon query retourne une ligne vide quand il n'y a pas de fermeture)

    Merci pour votre aide : Il y a probablement un moyen plus simple, mais je ne suis pas d'un niveau hyper avancé en SQL
    AngelJo

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Angeljo Voir le message
    SET @CloseDate = (SELECT Min(CreatedDateTime) FROM dbo.v_Sel_Suspended WHERE OldFieldValue = 'Suspended'
    AND IncidentNumber = @IncidentNumber AND CreatedDateTime> @CreatedDate)
    Ça fait beaucoup de requêtes SQL tout ça...


    Bon, je n'ai pas de SQL Server sous la main et il y a certainement des cas particuliers, mais tu peux essayer un truc dans ce genre:

    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
     
    ;WITH v AS
    (
      SELECT
        IncidentNumber,
        NewFieldValue,
        CreatedDateTime,
        ROW_NUMBER() 
          OVER (
            PARTITION BY IncidentNumber
            ORDER BY CreatedDateTime)
          AS RowNum
      FROM dbo.v_Sel_Suspended 
    )
     
    SELECT 
      A.IncidentNumber,
      A.CreatedDateTime,
      ISNULL(B.CreatedDateTime, GETDATE()) AS EndDateTime
    FROM v A
    LEFT JOIN v B
      ON (A.IncidentNumber = B.IncidentNumber
      AND A.RowNum = B.RowNum+1)
    WHERE A.NewFieldValue = 'Suspended'
    ORDER BY A.IncidentNumber, A.CreatedDateTime

    À défaut, tu peux aussi faire la chose suivante:

    - ordonner tous les changements d'états par numéro d'incident puis par date

    - parcourir cette liste, repérer les changement d'états (Open, Suspended, Solved), remplir une table temporaire au fur et à mesure

    - retourner la table temporaire comme résultat
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Merci
    Je vais essayer cette methode demain. Cela me parait plus correcte que ma premiere version. Je pensais bien aussi qu'elle prenait trop de temps et de ressources.

    Merci

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Angeljo Voir le message
    bonjour,
    Je dois trouver la différence de temps entre le moment ou un ticket est mis en Suspended (1 ligne) et le moment ou il change d'état (autre ligne) et quitte le statut de suspended
    j'ai une view comme ceci :

    Newvalue oldvalue incidentnumber Date
    Suspended Open 194094 6/04/2012 9:12
    Solved Suspended 195932 6/01/2012 9:26
    Suspended Open 197688 15/06/2012 9:35
    Solved Suspended 197688 18/06/2012 3:21
    Open Suspended 184952 6/04/2012 8:46
    Suspended Open 196449 6/04/2012 11:12
    Solved Suspended 196449 6/04/2012 13:57
    Suspended Open 197529 6/11/2012 16:51
    Open Suspended 197529 6/12/2012 6:50
    Suspended Open 197529 6/12/2012 16:57
    Solved Suspended 197529 13/06/2012 11:26
    Heureusement que c'est une vue, car si c'était une table, elle serait fausse (viol de FN).
    Mais de toute façon pour cette requête il est nécessaire de travailler sur la table, car nous ne connaissons pas la clef dans cette vue; Or il est possible que deux événements d'un même objet se fasse à la même date heure ce qui conduirait à une requête impossible à traiter.
    En sus la seconde colonne est redondante.

    Postez donc la structure de la table sous forme DDL. Ce faisant vous respecterez la charte de postage.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Désolée d'être un peu newbie
    mais c'est pour cela que je demande de l'aide.

    En ce qui concerne la structure de la table, c'est ainsi qu'elle se présente. J'ai fait une vue, juste pour récuperer les données dont j'ai besoin, à savoir :

    toutes les lignes dont NewValue = Suspended > le statut Suspended est déclenché
    toutes les lignes dont OldValue = Suspended > le statut Suspended est stoppé
    en plus dans des dates définies.

    ==> je dois mesurer le temps entre 2 lignes d'un même ticket .
    Peu importe si le la date/heure est la même dans 2 lignes: le statut 'Suspended' ne peut avoir la même date dans un même ticket. Si il y a plusieurs evenements 'Suspended' dans un même ticket, c'est toujours à des dates différentes. Il faut donc travailler dans la chronologie, en tenant compte qu'on peut avoir une ouverture du 'Suspended' sans avoir encore la ligne de fermeture.

    Je précise que je ne suis pas à l'origine de cette table ni de la façon dont les données sont structurées et récuperées. J'essaie juste d'en sortir des données lisibles.

    Il existe une clé dans la table. La structure se présente ainsi:

    Rec_Id ................................. (PK, char(32))
    NewValue .............................varchar(256)
    OldValue ...............................varchar(256)
    CreatedDate...........................datetime
    IncidentNumber.......................decimal(10,0)

    J'espère qu'ainsi c'est plus compréhensible, pour des experts. Désolée pour mon 'newbiisme'

  6. #6
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Au fait, Mr Brouard
    J'ai votre bouquin : SQL
    Et je l'utilise très souvent. Malheureusement, là je suis en voyage et je ne l'ai pas avec moi.
    Je me demandais d'ailleurs s'il y en avait une nouvelle édition ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Merci pcaboche
    Je pense mon probleme resolu. J'ai fait des tests avec ta proposition. Je fais qq adaptations et cela fonctionne. Merci

Discussions similaires

  1. Requete sur des champs qui ne sont pas dans une autre table
    Par jean christophe dans le forum Débuter
    Réponses: 4
    Dernier message: 20/05/2010, 18h05
  2. [RegEx] Lister des patterns qui ne sont pas dans une liste
    Par guidav dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2007, 18h14
  3. obtenir des entrees qui ne sont pas dans une table
    Par firejocker dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 26/12/2007, 23h07
  4. Réponses: 6
    Dernier message: 29/06/2007, 10h38

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