0
votes

Durée totale de la durée sans chevauchement du temps dans SQL Server

J'utilise SQL Server 2017.

Je veux résoudre comment savoir de temps de durée sans se chevaucher de temps. Reportez-vous au code ci-dessous.

données: xxx

résultat (seconde): xxx

déjà j'ai résolu le calcul de La durée totale de la durée de la durée .

mais j'ai raté le temps qui se chevauche comme des données de groupe 1. xxx

Comment puis-je calculer le temps de durée sans se chevaucher de temps?

Il est difficile de faire des requêtes facilement et de bonnes performances. < / p>


3 commentaires

S'il vous plaît montrer ce que vous avez essayé (c'est-à-dire, montrez votre requête) et quels résultats obtenus par rapport aux résultats que vous attendez.


Pouvez-vous expliquer quelle durée et le temps de chevauchement signifie utiliser vos données d'échantillon?


Pouvez-vous expliquer pourquoi 1 | 2019-09-30 11:20:10 | 2019-09-30 11:20:20 n'est pas inclus dans le groupe 1? Ne cherchez-vous que la durée totale des heures de chevauchement? Parce que ce n'est pas la façon dont votre question est intitulée.


6 Réponses :


1
votes

Vous pouvez essayer la méthode appelée "lacunes et îles": xxx

résultat:

 Entrez la description de l'image ici


1 commentaires

Ce sera un résultat incorrect. (1, '2019-10-01 23:59:30', '2019-10-02 00:00:30'), (1, '2019-09-30 10:00:00', '2019-09 -30 10:01:00 ');



2
votes

En référence à, et sur la base de, requêtes SQL pour des périodes de temps de chevauchement sur SQL Server ...

Lorsque vous comparez deux périodes T1 et T2, il y a cinq possibilités: P>

  1. T1 et T2 sont disjoints, ils n'ont pas de chevauchement. Li>
  2. T1 englobe complètement T2. Li>
  3. T2 entièrement englobe T1. LI>
  4. T1 chevauche le début de T2. Li>
  5. T2 chevauche le début de T1. Li> ol>

    Ceci est composé lorsque T3 est introduit et peut chevaucher tout, tout ou aucun de T1 et T2. P>

    commençant par votre exemple de données: P>

    Group       DurationTime
    ----------- ------------
    1           80
    2           20
    3           30
    


0 commentaires

0
votes
SELECT [GROUP]
    ,sum(CONVERT(INTEGER, REPLACE(CONVERT(VARCHAR, TODATE, 24), ':', '')) - CONVERT(INTEGER, REPLACE(CONVERT(VARCHAR, FROMDATE, 24), ':', ''))) as DurationTime
FROM GROUPS
GROUP BY [GROUP]

0 commentaires

0
votes

Mise en œuvre SQL de l'algorithme de Marzullo: https://fr.wikipedia.org/wiki/marzullo % 27S_ALGORITHM . xxx

le résultat: xxx

L'idée est simple:

  1. Prenez toutes les dates (dedated et Todate) dans une seule colonne en ajoutant une deuxième colonne avec un index 1 s'il s'agit dedater, -1 s'il est todate.
  2. cumulatif résume l'index afin de trouver le début et la fin d'une gamme. index = 1 et cumul = 1 est un début, index = -1 et cumul = 0 est fin sur
  3. groupe date en paires où une paire a des dates de début et de fin
  4. Calculez la durée d'une plage
  5. Résumé des durées de la durée par groupe

0 commentaires

0
votes

Je m'approcherais comme un problème de lacunes et de îles. Vous pouvez identifier les "îles" en procédant comme suit:

  • Déterminez où une "île" commence, ce qui serait une lacune de tous les enregistrements précédents.
  • Faites une somme cumulative des débuts pour identifier un groupement.
  • agrégat.

    Vous pouvez le faire à l'aide des fonctions de la fenêtre: xxx

    Vous pouvez ensuite agréger cela par groupid : < Pré> xxx

    ici est un dB <> fidoue. < / p>


0 commentaires

0
votes

algorithme de marzullo ( https://stackoverflow.com/a/58133814/12130544 ) est le meilleur de mon vivre. Non seulement pour calculer la durée de l'événement, mais surtout pour l'identification des intervalles de validité non croisés. Utilisé avec succès cet algorithme pour identifier les périodes lorsque SKU est en assortiment du magasin dans le commerce de détail et d'identifier les dates de début et de fin de la session de données mobiles du client dans les télécommunications. Et pour de nombreux autres scénarios. Fortement recommandé.


0 commentaires