2017-05-17 1 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

날짜 시간 datetype가 null 값을 포함 할 수 없기 때문에 당신이 날짜 시간 값을 구문 분석하기 전에 DBNull.Value를 확인해야하고 널 (null). DBNull.Value와 object null은 서로 다른 두 가지임을 기억하십시오.

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

여기

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; 
} 
관련 문제