首页 > 解决方案 > DataTable.Select 将 DateTime 存储为字符串

问题描述

我有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() + "'");

标签: c#sqldatetimeselectdatatable

解决方案


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

由于您已经违反了所有这些规则,因此大多数赌注都失败了,您可能必须通过迭代行、获取值并进行自己的转换来手动进行过滤。LINQ via.AsEnumerable() 可能会有所帮助;它当然不能让它变得更糟:)


*=在适当的地方有一小部分问题DataTable;如果您提前知道数据的架构足以发出Select查询:这不是其中之一


推荐阅读