7
votes

Vérifiez si une table contient des horaires de chevauchement

J'ai un jeu de données avec deux colonnes fromdate code> et todate code>, qui sont au format à la chaîne. Je veux vérifier s'il y a des enregistrements en double dans ma table.ie xxx pré>

Le tableau contient des enregistrements en double lorsque leur plage de date est la mappage pour P>

From Date       To Date      
----------------------      
9/01/2012    9/16/2012   
9/15/2012    9/23/2012


4 commentaires

@Sticho: Merci d'être modifié.


Voulez-vous dire "exactement les mêmes dates" ou "Timespans qui se chevauchent"?


@MARE INFINITUS: Les allers-chevauchements se chevauchent comme indiqué dans l'exemple ci-dessus


S'il vous plaît jeter un coup d'œil à ma réponse.


7 Réponses :


0
votes

Utilisez DataTable.Search () Mehod pour trouver l'existence de n'importe quel enregistrement de votre DataTable de cette façon, vous pouvez appliquer l'unicité de vos dossiers.

quelque chose comme ça xxx

pour plus aller ici


1 commentaires

Je n'ai aucune expression.Records sont déjà dans le jeu de données. Je veux vérifier si les enregistrements existants ont une valeur de plage de duplication !!



0
votes

Essayez d'analyser la colonne "à la date" et pour chacun, recherchez la colonne "De la date" de toute date antérieure qui a une date correspondante ultérieure "à ce jour".


1 commentaires

Une boucle imbriquée (croix rejoindre avec filtre). Coûteux!



1
votes

Trier par TODATE , fromdate (ou construit un tableau trié d'index dans votre jeu de données). Boucle de la position de la rangée ou de la matrice n ° 2 jusqu'à la fin et voyez si le Datedate <= à l'élément précédent. Placez les articles qui se chevauchent dans une liste. Travail fait.

Vous pouvez également trier par fromdate , todate et faire une logique similaire.


0 commentaires

1
votes
var query = from row in dt.AsEnumerable()
            from row1 in dt.AsEnumerable()
            where
            (

                 (
                     DateTime.Parse(row1.Field<string>("fromDate")) >= DateTime.Parse(row.Field<string>("fromDate")) &&
                     DateTime.Parse(row1.Field<string>("fromDate")) <= DateTime.Parse(row.Field<string>("toDate"))
                 )
                 ||
                 (
                     DateTime.Parse(row1.Field<string>("toDate")) >= DateTime.Parse(row.Field<string>("fromDate")) &&
                     DateTime.Parse(row1.Field<string>("toDate")) <= DateTime.Parse(row.Field<string>("toDate"))
                 )
            )
            select new
            {
                fromDate = DateTime.Parse(row1.Field<string>("fromDate")),
                toDate = DateTime.Parse(row1.Field<string>("toDate"))
            };
//This lst contains the dates which are overlapping    
var lst = query.Distinct().ToList();

4 commentaires

Bon, mais ce serait mieux si les données de DataTable seraient en format DateTime, il sauvera DateTime.parse pour chaque enregistrement X 2.


@ Pravin: Avez-vous couru la requête..bcz quand je l'exécute ... La variable LST montre 0, même lorsque j'ai des enregistrements: 1er Datedate: 8/1/2012 1er TODATE: 8/2/2012 2nd Datedate: 8/1/2012 2e Todate 8/11/2012


Exactement, je n'ai aucun résultat aussi.


Exemple que j'ai montré juste compare-vous à partir deDate & avec



1
votes

Ok d'accord, une autojoin aidera ici:

J'ai une petite teneur en classe, juste pour répondre à vos besoins xxx

alors j'ai quelques TestData

var list = nouvelle liste (); xxx

et voici la solution: (avec une inspiration d'Oranob, merci pour ça ) xxx

Peut-être que vous voulez laisser sortir le deuxième identifiant (comme vous aurez des duplicats Ici (1/6) et (6/1)


0 commentaires

0
votes

Si vous gérez de gros datables, vous devez utiliser @erike Response. Ce qui a besoin de plus de lignes de code, mais est définitivement le plus efficace de loin.

Si sa petite table et que vous préférez comparer chacune des deux rangées. Vous pouvez utiliser ce que les autres conseillent. Assurez-vous simplement d'empêcher la ligne d'être comparée à elle-même et de dupliquer dans l'énumération des résultats. P>

var query = from x in list
            where list.Exists((y) => x != y &&
                                     x.FromDate <= y.ToDate &&
                                     y.FromDate <= x.ToDate)
            select x;


0 commentaires

0
votes
strong textDeclare @Table Table  
(  
    RowId Int Identity(1, 1) Not Null, 
      Id NChar(3) Not Null, 
      StartDate DATETIME Not Null, 
      EndDate DATETIME Not Null 
);  

Insert Into @Table (Id, StartDate, EndDate)  
Select 'id1', '20131210 10:10', '20131220 10:10' Union All  
Select 'id1', '20131211', '20131215' Union All  
Select 'id1', '20131201', '20131205' Union All  
Select 'id1', '20131206', '20131208' Union All  
Select 'id1', '20131225 10:10', '20131225 10:11'
Select *  
From @Table;  


With Overlaps (OverlapRowId, BaseRowId, OStart, OEnd, BStart, BEnd)  
As  
(  
        Select Overlap.RowId, Base.RowId, Overlap.StartDate, Overlap.EndDate, Base.StartDate, Base.EndDate 
        From @Table As Base  
        Inner Join @Table As Overlap On Overlap.Id = Base.Id  
        Where (((Overlap.StartDate > Base.StartDate) And (Overlap.StartDate < Base.EndDate))
          Or ((Overlap.StartDate = Base.StartDate) And (Overlap.EndDate > Base.EndDate))) 
          And (Base.RowId != Overlap.RowId) 
) 
-- Remove records that were found to cause overlap issues.  
Delete T  
From @Table As T  
Inner Join  
(  
        Select O.OverlapRowId   
        From Overlaps As O 
        Left Join Overlaps As Fp On Fp.OverlapRowId = O.BaseRowId  
        Where (Fp.OverlapRowId Is Null) 
) As SubQuery On SubQuery.OverlapRowId = T.RowId;  

-- Select the valid options.  
Select RowId, Id, StartDate, EndDate  
From @Table where StartDate<EndDate;  
Go

1 commentaires

Merci beaucoup, appréciez vraiment votre aide avec cela. Je n'ai pas rencontré le scénario où il y a plusieurs enregistrements avec le même départ et se livrent. Cela serait vraiment aider plein si les données changent de l'ID. Merci!!!