猿问

DataTable.Select 将日期时间存储为字符串

我有DataTable一个DateTime存储为string像“二零一七年十二月二十零日”。我想选择过去 6 个月内的所有行。


我可以用一个foreach:


foreach (DataRow dr in dsErgebnisse.Tables[0].Rows)

{

   if (Convert.ToDateTime(dr[6].ToString()) > DateTime.Now.AddMonths(-6))

   {

       dsTemp.Tables[0].ImportRow(dr);

   }

}

这给了我 3.613 行。


我尝试通过选择来检查它是否更快:


DataRow[] foundRows = dsErgebnisse.Tables[0].Select("DATUM > '" + DateTime.Now.AddMonths(-6).ToShortDateString() + "'");

DATUM是我的列,其中DateTime存储为字符串。这给了我 2.624 行。


为什么有区别?我试图在 select 语句中使用 convert 但我失败了System.Data.EvaluateException:


foundRows = dsErgebnisse.Tables[0].Select("Convert(DATUM, 'System.DateTime') > '" + DateTime.Now.AddMonths(-6).ToShortDateString() + "'");


UYOU
浏览 703回答 1
1回答

鸿蒙传说

规则 0:停止使用DataTable......永远*规则 1:不要将日期/时间值存储为字符串;将它们存储为DateTime或类似规则 2:如果您忽略规则 0 和 1,请确保以可排序的顺序存储它们,例如“2017-12-20”由于您违反了所有这些规则,因此大多数赌注都失败了,您可能必须通过遍历行、获取值并进行自己的转换来手动执行过滤器。LINQ via.AsEnumerable() 可能会有所帮助;它当然不能让它变得更糟:)*=在DataTable适当的地方有一小部分问题;如果您事先了解数据的架构足以发出Select查询:这不是其中之一
随时随地看视频慕课网APP
我要回答