DataTable.Select,DateTime存储为String

Kᴀτ*_*ᴀτᴢ 0 c# sql datatable select datetime

我有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);
   }
}
Run Code Online (Sandbox Code Playgroud)

这给了我3.613行.

我尝试用select来检查它是否更快:

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

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

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

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

Mar*_*ell 5

  • 规则0:停止使用DataTable...只是永远*
  • 规则1:不要将日期/时间值存储为字符串; 将它们存储为DateTime或类似
  • 规则2:如果忽略规则0和1,请确保将它们存储在"2017-12-20"之类的可排序顺序中

由于你已经破坏了所有这些规则,大多数赌注都已关闭,你可能需要通过遍历行,获取值和进行自己的转换来手动执行过滤.LINQ via .AsEnumerable() 可能有所帮助; 它当然不能让它变得更糟:)


*=在DataTable适当的情况下存在一小部分问题; 如果你事先知道数据的模式就足以发出一个Select查询:这不是其中之一