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 :

Compter les jours distincts sur des intervalles de dates superposés


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2002
    Messages : 39
    Points : 44
    Points
    44
    Par défaut Compter les jours distincts sur des intervalles de dates superposés
    Bonjour, voici mon problème. J'ai deux colonnes appelées DateDebut et DateFin dans une table T1. Ces intervalles de début et de fin peuvent se superposer et peuvent se répéter, ils peuvent aussi se référer à une journée unique (DateDebut = DateFin).

    Je désire compter (et obtenir un nombre entier) le nombre de jours distincts de plusieurs intervalles à la fois. Par exemple :
    Table T1
    DateDebut - DateFin
    2013-01-01 - 2013-01-03
    2013-01-03 - 2013-01-03
    2013-01-03 - 2013-01-05
    2013-01-06 - 2013-01-06
    2013-01-05 - 2013-01-07

    Me donnerait 7. (les jours 01-02-03-04-05-06-07...)

    Ça m’apparaissait simple mais finalement pas tant. J'ai pensé utiliser des DATEDIFF et de soustraire le nombre de jours ou l'intervalle est un jour unique lorsqu'il croise une date d'un autre intervalle mais ça n'élimine pas les jours ou ces intervalles uniques se retrouvent au centre d'un intervalle (voir 2013-01-06).

    Peut-être d'autres idées plus simples?

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    L'idéal serait d'implémenter des tables de calendrier pour partir de la liste des jours dans votre plage.

    A défaut, vous pouvez faire une requête récursive :

    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
     
    ;WITH Calendrier as (
    	SELECT MIN(DateDebut) as jour, MAX(DateFin) AS Fin
    	FROM	T1
     
    	UNION ALL
     
    	SELECT DATEADD(DAY, 1, jour), Fin
    	FROM	Calendrier
    	WHERE	jour < Fin
    )
    SELECT COUNT(*) AS NbJours
    FROM Calendrier
    WHERE EXISTS(
    	SELECT	1 
    	FROM	T1
    	WHERE	jour BETWEEN DateDebut AND DateFin
    )
    OPTION (MAXRECURSION 0)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Ceci dépasse les capacités de SQL et même avec TSQL, c'est assez limite.

    Comme il a été suggéré auparavent, c'est la structure des données qu'il faut enrichir.

    Il existe plein d'exemples de tables de temporisation qui permettrait de ramener la structure des données dans un modèle relationnel adéquat.

    Et règle générale, quand SQL n'a pas de réponse à un problème, c'est que les données ne respectent pas les règles de normalisation.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2002
    Messages : 39
    Points : 44
    Points
    44
    Par défaut
    Merci pour la requête récursive. Et effectivement le contenu des données n'est surement pas assez complet pour manipuler avec efficacité ce genre de calcul, je vais sérieusement songer a revoir la structure de la BD pour faciliter le travail.

    Merci encore! Je vais considérer comme résolu.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/06/2015, 21h46
  2. Réponses: 8
    Dernier message: 13/08/2013, 19h02
  3. Problème d'index ignoré sur des intervalles de dates
    Par Sebajuste dans le forum Requêtes
    Réponses: 8
    Dernier message: 06/06/2013, 11h27
  4. Requêtes sur des intervalles de dates
    Par Tidus159 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/05/2011, 17h43
  5. Réponses: 10
    Dernier message: 28/05/2005, 12h19

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