Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据表按精确日期时间选择_C#_Datetime_Datatable - Fatal编程技术网

C# 数据表按精确日期时间选择

C# 数据表按精确日期时间选择,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) {

我有一个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]);
}
但是

导致错误:

语法错误:“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);