2017-05-17 2 views
0

J'ai une table de données qui contient un "CreateDate" et un "UpdateDate" colonnes. J'essaye de trouver le plus petit CreateDate et le plus grand UpdateDate. Ce n'est pas difficile mais les colonnes peuvent contenir NULL (ou DBNull) et cela me fait trébucher. J'utilisais ce qui suit:Trouver datetime min/max dans les lignes datatable

DateTime dtMin = DateTime.MaxValue; 
DateTime dtMax = DateTime.MinValue; 

foreach(DataRow dr in dt.Rows) 
{ 
    DateTime dtCreateDate = dr.Field<DateTime>("CreateDate"); 
    DateTime dtUpdateDate = dr.Field<DateTime>("UpdateDate"); 
    dtMin = dtMin > dtCreateDate ? dtCreateDate : dtMin; 
    dtMax = dtMax > dtUpdateDate ? dtMax : dtUpdateDate; 
} 

Jusqu'à ce que je tape une ligne avec une date NULL.

Répondre

0

Vous devriez vérifier DBNull.Value et null avant vous analysez les valeurs à DateTime car DateTime DateType ne peut pas contenir des valeurs nulles. Rappelez-vous que DBNull.Value et objet null sont 2 choses différentes

En déclarant DateTime ?, dtCreateDate, dtUpdateDate peut contenir une valeur nulle. Ensuite, si vous recevez une valeur nulle, vous pouvez passer à la comparaison avec dtMin et dtMax.

foreach (DataRow dr in dt.Rows) 
{ 
    DateTime? dtCreateDate = dr["CreateDate"] == DBNull.Value || dr["CreateDate"] == null ? (DateTime?) null : dr.Field<DateTime>("CreateDate"); 
    DateTime? dtUpdateDate = dr["UpdateDate"] == DBNull.Value || dr["UpdateDate"] == null ? (DateTime?) null: dr.Field<DateTime>("UpdateDate"); 


    dtMin = dtCreateDate == null ? dtMin : (dtMin > dtCreateDate ? dtCreateDate : dtMin); 
    dtMax = dtUpdateDate == null ? dtMax : (dtMax > dtUpdateDate ? dtMax : dtUpdateDate); 

} 
+0

Je pensais à ce sujet, mais si dans la première itération j'ai trouvé un dtCraeteDate valide et dans l'itération suivante j'obtiens une date NULL à comparer, je ne veux pas remettre dtCreatDate à DateTime.MinValue. – NoBullMan

+0

J'ai mis à jour ma suggestion. Déclarez DateTime? qui vous permettent de contenir une valeur nulle – hiule

0

Vérifiez d'abord si la valeur de la datarow est nulle avant de poursuivre:

foreach (DataRow dr in dt.Rows) 
    { 
     if (dr["CreateDate"] != null && dr["UpdateDate"] != null) 
     { 
      //TODO: Logic here 
     } 
    } 
0

Cette aide carte vous

foreach (DataRow dr in dt.Rows) 
{ 
    DateTime? dtCreateDate = (DateTime?)dr["CreateDate"]; 
    DateTime? dtUpdateDate = (DateTime?)dr["UpdateDate"]; 
    dtMin = (dtCreateDate != null && dtMin > dtCreateDate) ? dtCreateDate.Value : dtMin; 
    dtMax = (dtUpdateDate != null && dtMax < dtUpdateDate) ? dtUpdateDate.Value : dtMax; 
} 
0

utiliser ici l'opérateur coalescent et opérateur conditionnel, pour gérer les conditions:

foreach (DataRow dr in dt.Rows) 
{ 
    // Collecting data from DataRow 
    DateTime? dtCreateDate =dr.Field<DateTime?>("CreateDate")??(DateTime?)null; 
    DateTime? dtUpdateDate=dr.Field<DateTime?>("UpdateDate")??(DateTime?)null; 

    // Manupulating condition to get required result 
    dtMin = dtCreateDate != null ?(dtMin > dtCreateDate ? dtCreateDate : dtMin) : dtMin; 
    dtMax = dtUpdateDate != null ?(dtMax > dtUpdateDate ? dtMax : dtUpdateDate): dtMax; 
}