在数据表行中查找最小/最大日期时间

时间:2017-05-17 02:02:27

标签: c# datatable minmax

我有一个数据表,其中包含" CreateDate"和一个" UpdateDate"列。我试图找到最小的CreateDate和最大的UpdateDate。这并不难,但是列可以包含NULL(或DBNull),这让我感到沮丧。我使用以下内容:

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日期打到一行。

5 个答案:

答案 0 :(得分:0)

在继续之前,首先检查数据行上的值是否为空:

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

答案 1 :(得分:0)

在将值解析为DateTime之前,应检查DBNull.Value和null,因为DateTime datetype不能包含空值。 请记住,DBNull.Value和对象null是两个不同的东西

通过声明DateTime?,dtCreateDate,dtUpdateDate可以包含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);

}

答案 2 :(得分:0)

你可以使用Min&amp;数据表支持的最大计算。其他选择是使用LINQ来查找min&amp;最大。如需参考,请参阅以下链接中的答案。 How to select min and max values of a column in a datatable?

答案 3 :(得分: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;
}

答案 4 :(得分: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;
}