J'ai un jeu de données avec deux colonnes Le tableau contient des enregistrements en double lorsque leur plage de date est la mappage pour P> 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
From Date To Date
----------------------
9/01/2012 9/16/2012
9/15/2012 9/23/2012
7 Réponses :
Utilisez quelque chose comme ça p> pour plus aller ici p> p> DataTable.Search () Code> Mehod pour trouver l'existence de n'importe quel enregistrement de votre
DataTable code> de cette façon, vous pouvez appliquer l'unicité de vos dossiers.
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 !!
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". P>
Une boucle imbriquée (croix rejoindre avec filtre). Coûteux!
Trier par Vous pouvez également trier par TODATE code>,
fromdate code> (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. P>
fromdate code>,
todate code> et faire une logique similaire. P>
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();
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
Ok d'accord, une autojoin aidera ici:
J'ai une petite teneur en classe, juste pour répondre à vos besoins p> alors j'ai quelques TestData P > var list = nouvelle liste (); p> Peut-être que vous voulez laisser sortir le deuxième identifiant (comme vous aurez des duplicats
Ici (1/6) et (6/1) P> P>
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;
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
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!!!
@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.