我有一个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() + "'");
答案 0 :(得分:5)
DataTable
... DateTime
或类似的由于您违反了所有这些规则,因此大多数赌注都没有了,您可能必须手动进行筛选,方法是遍历行,获取值并进行自己的转换。通过.AsEnumerable()
的LINQ 可以提供帮助;它当然不能使它变得更糟:)
* =在DataTable
适用的情况下,存在一小类问题;如果您足够了解数据的架构,足以发出Select
查询:这不是其中之一