2017-05-17 8 views
0

"CreateDate"と "UpdateDate"列を含むデータテーブルがあります。私は最小のCreateDateと最大のUpdateDateを見つけようとしています。それは困難ではありませんが、列にはNULL(またはDBNull)が含まれている可能性があります。私は以下を使用していました:データテーブル行の最小/最大datetimeを検索

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; 
} 

私はNULLの日付で行をヒットするまで。 DataRowの値が先に進む前にnullの最初の場合

答えて

0

のDateTime DATETYPEがNULL値を含めることはできませんので、あなたがたDateTimeに値を解析する前に、あなたがDBNull.Valueのをチェックする必要があり、nullを返します。 DBNull.Valueとオブジェクトnullは2つの異なるものであることを覚えておいてください。

DateTime?、dtCreateDateを宣言することにより、dtUpdateDateにはnull値を含めることができます。次に、null値を受け取った場合は、スキップしてdtMinおよび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

私はこのことについて思ったが、最初の繰り返しで、私が見つかった場合有効なdtCraeteDateと次の反復で比較する日付がNULLになります.dtCreatDateをDateTime.MinValueに戻したくありません。 – NoBullMan

+0

私の提案を更新しました。 DateTimeを宣言しますか?あなたはnull値を含むことができます – hiule

0

チェック:

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

データテーブルでサポートされているMin &最大計算を使用できます。他のオプションはLINQを使用して最小値を見つけることです& max。参考のために、以下のリンクの答えをご覧ください。ここで How to select min and max values of a column in a datatable?

0

あなたは

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

このマップヘルプは状況を管理するため、合体演算子と条件演算子を使用します。

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; 
} 
関連する問題