数据表按确切的DateTime选择

use*_*963 3 c# datatable datetime

我有一个数据表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]);
}
Run Code Online (Sandbox Code Playgroud)

DataRow[] result = xData.Select("TimeStamp2 = " + str);
Run Code Online (Sandbox Code Playgroud)

导致错误:

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

我进行了搜索,但是大多数示例仅显示如何按日期而不是datetime毫秒进行选择。

vc *_* 74 5

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

起初,我认为亚秒级精度不受支持,Select但根据德米特里(Dmitry)的回答却是。

另一种方法是使用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]);
}
Run Code Online (Sandbox Code Playgroud)


Dmi*_*try 5

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

DataRow[] result = xData.Select("TimeStamp2 = #" + str + "#");
Run Code Online (Sandbox Code Playgroud)

请参阅示例部分。

如果TimeStamp2列的类型是a string,则将值括在引号中'

DataRow[] result = xData.Select("TimeStamp2 = '" + str + "'");
Run Code Online (Sandbox Code Playgroud)

编辑列类型的
示例代码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") + "#");
Run Code Online (Sandbox Code Playgroud)

结果:一个DataRowrows变量。