C# 数据表按精确日期时间选择
我有一个DataTableC# 数据表按精确日期时间选择,c#,datetime,datatable,C#,Datetime,Datatable,我有一个DataTablexData,它有一个精度为毫秒的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) {
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]);
}
但是
导致错误:
语法错误:“16”运算符后缺少操作数
我已经搜索过了,但大多数示例只显示了如何按日期选择,而不是以毫秒为单位选择完整的
日期时间。问题是,您必须将要查找的日期/时间传递给过滤器
起初,我认为Select
不支持亚秒精度,但根据Dmitry的回答是这样的
另一种方法是使用,它允许您避免序列化日期/时间:
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]);
}
DateTime dt=timeStampList[i];
IEnumerable selectedRows=
其中(row=>(row.Field(“TimeStamp2”)==dt));
foreach(选定行中的数据行)
{
WriteLine(“{0},{1}”,行[0],行[1]);
}
如果timestam2
列具有DateTime
类型,则应在DateTime
字符串周围加上
字符:
DataRow[] result = xData.Select("TimeStamp2 = #" + str + "#");
见本节
如果TimeStamp2
列的类型是字符串
,请将值括在引号中'
:
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") + "#");
结果:rows
变量中有一个DataRow
。我在使用DateTime文本时也遇到了问题,因为它的精度高达纳秒如果可能,您可以尝试使用表中的长数据类型,并使用DateTime.Ticks
比较DateTime。这使得select查询相对来说非常容易
您的查询将转换为
DateTime dt = timeStampList[i];
long dtTicks = dt.Ticks;
DataRow[] result = xData.Select("TimeStamp2 = " + dtTicks);
我发现这种方法在日期范围之间搜索时也非常简单
如果您碰巧以日期时间的形式返回该值,则可以按照
return new DateTime(valueInTicks);
@为什么?我已经在DateTime
列中尝试过了。很有意思,我认为不会。我在文件中没有看到任何东西说亚秒精度是可能的,但根据你的例子,它似乎是有效的+1+1,你的方法更好,因为它不使用字符串。没有解释的反对票?我的解决方案解决了OP的问题。因为datatable是内存中的数据结构,所以我认为它可以修改。
return new DateTime(valueInTicks);