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

Langage SQL Discussion :

Calculer le chevauchement de dates ( overlapping )


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 63
    Par défaut Calculer le chevauchement de dates ( overlapping )
    Bonjour,
    Je bloque sur le fameux hic du calcule du chevauchement des dates, je m'explique:
    j'ai une table booking :
    ID|DateCheckIn|DateCheckOut|NB.NUIT|CA|
    01|2019-01-30 |2019-02-03 |4 | 400.0|* chevauchement entre janvier et févier
    02|2019-01-29 |2019-01-31 |2 |150.0 |

    * le but est de faire du prévisionnelle = mentionner une plage date exp: 2019-02-01 au 2019-02-28; ma raquette doit me ressortir le CA: chiffre d'affaire de ma plage date, pour l'exemple du chevauchement ID 01, normalement je dois compter juste les nuitées du 01-02 du mois de février:
    J'ai un peux tâtonner avec cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CASE
    WHEN datedep>='2019-01-01' AND datearr<='2019-01-01' THEN DATEDIFF(datedep,'2019-01-01')
    WHEN datedep>'2019-01-31' AND datearr<'2019-01-31' THEN DATEDIFF(datedep,'2019-01-31')
    END AS overlop
     
    FROM prevision_brute 
    WHERE datedep>='2019-01-01' AND datearr<='2019-01-31'
    GROUP BY numresa
    Franchement je suis coince la
    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Vos colonnes temporelles sont elles nullables ? Si oui, créer une UDF comme je l'ai indiquée ici :
    https://sqlpro.developpez.com/cours/...ntemps/#L1.2.2
    En particulier, le prédicat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (P1_DEBUT > P2_DEBUT AND (P1_DEBUT < P2_FIN OR P1_FIN < P2_FIN)) OR
    (P2_DEBUT > P1_DEBUT AND (P2_DEBUT < P1_FIN OR P2_FIN < P1_FIN)) OR
    (P1_DEBUT = P2_DEBUT AND (P1_FIN IS NOT NULL AND P2_FIN IS NOT NULL))
    Si vos colonne sont non nullables :
    P1_FIN < P2_DEBUT OR P1_DEBUT > P2_FIN

    Exemple pour MS SQL Server :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE FUNCTION OVERLAPS (@P1_DEBUT DATETIME2, @P1_FIN  DATETIME2, @P2_DEBUT DATETIME2, @P2_FIN  DATETIME2)
    RETURNS BIT
    AS
    BEGIN
    RETURN CASE WHEN (@P1_DEBUT > @P2_DEBUT AND (@P1_DEBUT < @P2_FIN OR @P1_FIN < @P2_FIN)) OR
                     (@P2_DEBUT > @P1_DEBUT AND (@P2_DEBUT < @P1_FIN OR @P2_FIN < @P1_FIN)) OR
                     (@P1_DEBUT = @P2_DEBUT AND (@P1_FIN IS NOT NULL AND @P2_FIN IS NOT NULL)) 
                   THEN 1
                ELSE 0
           END;
    END;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE FUNCTION OVERLAPS (@P1_DEBUT DATETIME2, @P1_FIN  DATETIME2, @P2_DEBUT DATETIME2, @P2_FIN  DATETIME2)
    RETURNS BIT
    AS
    BEGIN
    RETURN CASE WHEN (@P1_FIN < @P2_DEBUT OR @P1_DEBUT > @P2_FIN)
                   THEN 0
                ELSE 1
           END;
    END
    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/ * * * * *

  3. #3
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 63
    Par défaut
    Merci beaucoup pour votre réponse,
    Function overlap faite, mais le résultat n'est pas concluant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT numresa,datearr,datedep,overlap(datearr, datedep, '2019-02-01','2019-02-28') AS ovr1 FROM prevision_brute 
    GROUP BY numresa
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    numresa	datearr	        datedep	     ovr1
    86523	2019-01-31	2019-02-06	1
    86525	2019-02-13	2019-02-15	1
    86533	2019-02-09	2019-02-11	1
    85156	2019-01-10	2019-01-22	0
    85165	2019-03-29	2019-04-01	0  
    86609	2019-01-25	2019-01-27	0
    86608	2019-01-23	2019-01-24	0

Discussions similaires

  1. Calculer l'âge avec dates dans Excel
    Par crosse9 dans le forum Excel
    Réponses: 9
    Dernier message: 06/01/2011, 14h52
  2. calcul délais entre deux dates avec plages horaires
    Par leila eco dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 03/01/2007, 16h51
  3. [VBA-E]Calculer nbre de Jrs avec chevauchement de dates
    Par YoungBlood dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/06/2006, 20h55
  4. [SQL Server] Calcul durée entre 2 dates sans les dimanches
    Par sarahsonia dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/04/2006, 17h59
  5. calculer un intervalle de dates
    Par vodevil dans le forum Modules
    Réponses: 3
    Dernier message: 16/01/2006, 20h04

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