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

Langage SQL Discussion :

Différence entre deux dates avec exclusions


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    octobre 2006
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 411
    Points : 110
    Points
    110
    Par défaut Différence entre deux dates avec exclusions
    Bonjour,

    Je travaille sur un outil de ticketing.

    J'ai une table avec une colonne DATE_DEMANDE_OPEN qui correspond à l'ouverture d'un ticket et une DATE_INTER_OPEN qui correspond à date/heure d'ouverture de la première intervention (première prise en charge du ticket).

    Je n'ai pas de problème pour avoir le délai de prise en charge entre la colonne DATE_DEMANDE_OPEN et DATE_INTER_OPEN.

    Seulement, le support qui prend en charge ces tickets n'est ouvert que du lundi au vendredi de 9h/12 et 14h/18h.

    Comment exclure les périodes ou le support n'est pas ouvert :
    - entre midi et deux
    - la nuit
    - le week-end

    Merci pour votre aide,

    Matt

  2. #2
    Expert éminent sénior

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    4 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 4 898
    Points : 13 728
    Points
    13 728
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    La seule façon de connaître les périodes d'ouverture des services est d'avoir un calendrier par service avec les plages d'ouverture

  3. #3
    Membre régulier
    Inscrit en
    octobre 2006
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 411
    Points : 110
    Points
    110
    Par défaut
    Bonjour,

    Merci pour ton retour.

    Je n'arrive pas à construire la requête pour savoir les périodes à prendre en compte entre DATE_DEMANDE_OPEN et DATE_INTER_OPEN.

    Imaginons une table avec les horaires d'ouverture sur la semaine lundi au vendredi de 9h00 à 18h00 (1 enregistrement par jour de la semaine).

    Un client ouvre une demande le dimanche à 12h00 avec prise en charge le lundi à 10h30.

    Donc DATE_DEMANDE_OPEN = '29/09/2019 - 12:00' et DATE_INTER_OPEN = '30/09/2019 - 11h30'.

    Je n'arrive pas à construire ma requête pour que le DATEDIFF entre ma DATE_DEMANDE_OPEN et DATE_INTER_OPEN pour que celle-ci me retourne 2h30 et non 23h30.

    Merci pour votre aide,

    Matt

  4. #4
    Expert éminent sénior

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    4 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 4 898
    Points : 13 728
    Points
    13 728
    Billets dans le blog
    1
    Par défaut
    Comme mentionné précédemment, il faut une autre table dans laquelle on a toutes les périodes enregistrées, il faudra ensuite cumuler le nombre d'heures ouvrées comprises entre la date/heure de demande et la date/heure d'intervention
    Vous ne pouvez pas utiliser datediff() qui n'est applicable que pour faire une différence entre deux dates, sans tenir compte des périodes fermées

  5. #5
    Membre régulier
    Inscrit en
    octobre 2006
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 411
    Points : 110
    Points
    110
    Par défaut
    Bonjour,

    je comprend qu'il me faut une table avec les horaires d'ouverture dont je mentionne :

    "Imaginons une table avec les horaires d'ouverture sur la semaine lundi au vendredi de 9h00 à 18h00 (1 enregistrement par jour de la semaine)."

    Mais je n'arrive pas à construed la requête pour savoir que dans tel plage entre DATE_DEMANDE_OPEN et DATE_INTER_OPEN ça correspond à tel ou tel jour de ma ligne

    Matt

  6. #6
    Expert éminent sénior

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    4 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 4 898
    Points : 13 728
    Points
    13 728
    Billets dans le blog
    1
    Par défaut
    La réponse dépend du SGBD, les fonctions dates étant sensiblement différentes de l'un à l'autre.

    voici un exemple avec DB2 :


    Création du jeu d'essais
    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
    with Cal_Per_Ouv (DT1, DT2) as
        (select '2019-09-30 08:00:00', '2019-09-30 12:30:00'   from sysibm.sysdummy1
         union all
         select '2019-09-30 13:45:00', '2019-09-30 19:00:00'   from sysibm.sysdummy1
         union all
         select '2019-10-01 08:00:00', '2019-10-01 18:00:00'   from sysibm.sysdummy1
         union all
         select '2019-10-02 08:00:00', '2019-10-02 18:00:00'   from sysibm.sysdummy1
         union all
         select '2019-10-03 08:00:00', '2019-10-03 18:00:00'   from sysibm.sysdummy1
         union all
         select '2019-10-04 08:00:00', '2019-10-04 18:00:00'   from sysibm.sysdummy1
         union all
         select '2019-10-05 08:00:00', '2019-10-05 13:00:00'   from sysibm.sysdummy1
        )
    Requête de calcul du nombre d'heures ouvrées entre 2 dates/heures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select sum(timestampdiff(8, char(timestamp(dt2) - timestamp(DT1)))  )
    from cal_per_ouv
    where dt1 >= '2019-10-02 00:00:00'
      and dt2 <= '2019-10-05 23:59:59'
    ;
    Résultat (en heures, le paramètre 8 de la fonction timestampdiff retourne un résultat en heures) :
    Ce résultat est conforme : il y a bien 35 heures ouvrées d'après le calendrier entre le 2 octobre à 0h00 et le 5 octobre à minuit
    La difficulté c'est le cas où la période commence ou bien s'arrête à une heure différente de l'heure début ou de fin des plages d'ouverture.
    Par exemple si je demande entre le 2 octobre à10h30 et le 5 octobre à 10h00.
    À vous de voir quelle règle de gestion appliquer dans ce cas.

  7. #7
    Membre régulier
    Inscrit en
    octobre 2006
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 411
    Points : 110
    Points
    110
    Par défaut
    Ok.

    Merci pour cet exemple très clair.

    Bonne journée,

    Matt

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/07/2019, 09h59
  2. [MySQL] Différence entre deux dates avec condition
    Par neGo33 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 16/02/2012, 13h47
  3. Réponses: 2
    Dernier message: 21/07/2006, 14h04
  4. Différence entre deux dates
    Par pittzz dans le forum Oracle
    Réponses: 5
    Dernier message: 18/07/2005, 12h24
  5. Comment obtenir la différence entre deux dates ?
    Par jbat dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2005, 09h34

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