带有DateTime的DataTable.Select存储为字符串

时间:2018-06-20 08:02:51

标签: c# sql datetime select datatable

我有一个DataTable,其中一个DateTime存储为string,例如“ 20.12.2017”。 我想选择过去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() + "'");

1 个答案:

答案 0 :(得分:5)

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

由于您违反了所有这些规则,因此大多数赌注都没有了,您可能必须手动进行筛选,方法是遍历行,获取值并进行自己的转换。通过.AsEnumerable()的LINQ 可以提供帮助;它当然不能使它变得更糟:)


* =在DataTable适用的情况下,存在一小类问题;如果您足够了解数据的架构,足以发出Select查询:这不是其中之一

相关问题