DataTable按精确日期时间选择

时间:2014-10-19 19:40:49

标签: c# datetime datatable

我有一个DataTable xData,其DateTime列的精度为毫秒级,我需要提取与精确时间匹配的行(以毫秒为单位),但无法正确识别语法。

我试过

DateTime dt = timeStampList[i];
string str = dt.ToString("yyyy-MM-dd HH:mm:ss.fff");
DataRow[] result = xData.Select("TimeStamp2 = " + str);

foreach (DataRow row in result)
{
    Console.WriteLine("{0}, {1}", row[0], row[1]);
}

但是

DataRow[] result = xData.Select("TimeStamp2 = " + str);

导致错误:

  

语法错误:'16'运算符后缺少操作数。

我已搜索过,但大多数示例仅显示如何按日期选择,而不是以毫秒为单位选择完整的datetime

3 个答案:

答案 0 :(得分:4)

问题是您必须将您要查找的日期/时间传递给过滤器。

起初我认为Select不支持次秒精度,但根据德米特里的回答,它是。

另一种方法是使用Linq to DataSet,这样可以避免序列化日期/时间:

DateTime dt = timeStampList[i];

IEnumerable<DataRow> selectedRows = 
  xData.AsEnumerable().Where(row => (row.Field<DateTime>("TimeStamp2") == dt));

foreach (DataRow row in selectedRows)
{
  Console.WriteLine("{0}, {1}", row[0], row[1]);
}

答案 1 :(得分:4)

如果TimeStamp2列具有DateTime类型,则应使用DateTime字符包围#字符串:

DataRow[] result = xData.Select("TimeStamp2 = #" + str + "#");

请参阅Examples部分。

如果TimeStamp2列的类型为string,请将值括在引号'中:

DataRow[] result = xData.Select("TimeStamp2 = '" + str + "'");

修改
DateTime列类型的示例代码:

DataTable table = new DataTable();
table.Columns.Add(new DataColumn("A", typeof (DateTime)));
DateTime dt = new DateTime(2000, 1, 1, 1, 1, 1, 10);
table.Rows.Add(dt);
table.Rows.Add(DateTime.Now);
DataRow[] rows = table.Select("A = #" + dt.ToString("yyyy-MM-dd HH:mm:ss.fff") + "#");

结果:DataRow变量中有一个rows

答案 2 :(得分:-1)

当涉及到纳秒级的精度时,我在使用DateTime文字时也遇到了问题。 如果可能 ,您可以尝试在表中使用long数据类型,并使用DateTime.Ticks比较DateTime。这使得选择查询相对非常容易。

您的查询将转换为

DateTime dt = timeStampList[i];
long dtTicks = dt.Ticks;
DataRow[] result = xData.Select("TimeStamp2 = " + dtTicks);

我发现,即使在日期范围之间进行搜索,这种方法也很有效。

如果您恰巧将值作为DateTime返回,则可以很容易地完成

return new DateTime(valueInTicks);