【问题标题】:DataTable.Select with DateTime stored as StringDataTable.Select 将 DateTime 存储为字符串
【发布时间】:2018-11-29 07:01:16
【问题描述】:

我有一个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# sql datetime select datatable


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

    由于您已经违反了所有这些规则,因此大多数情况下都失败了,您可能必须手动执行过滤器,方法是遍历行、获取值并进行自己的转换。 LINQ via .AsEnumerable()可以帮助;它肯定不会让事情变得更糟:)


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

    【讨论】:

    • 感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2013-09-03
    • 2021-01-01
    • 2010-10-20
    • 2018-10-27
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多