我有一个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
。
答案 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);