关于c#:DataTable按确切的DateTime选择

DataTable Select by exact DateTime

我有一个数据表xData,其中的DateTime列具有毫秒精度,我需要提取与确切时间相匹配的行(以毫秒为单位),但语法不正确。

我尝试过

1
2
3
4
5
6
7
8
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]);
}

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

导致错误:

Syntax error: Missing operand after '16' operator.

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


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

起初,我认为Select不支持亚秒级精度,但根据Dmitry的回答,它是。

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

1
2
3
4
5
6
7
8
9
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]);
}


如果TimeStamp2列的类型为DateTime,则应将DateTime字符串用#字符括起来:

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

请参阅"示例"部分。

如果TimeStamp2列的类型是string,则将值用引号引起来'

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

编辑
DateTime列类型的示例代码:

1
2
3
4
5
6
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") +"#");

结果:rows变量中一个DataRow


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

您的查询将转换为

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

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

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

1
return new DateTime(valueInTicks);