C# DateTime列的时间组件上的DataTable RowFilter

C# DateTime列的时间组件上的DataTable RowFilter,c#,datetime,rowfilter,C#,Datetime,Rowfilter,我在DataTable中创建了名为Created的DataColumn,类型为DateTime,并创建了一个RowFilter表达式,以仅返回在任何一天的晚上10点之后创建的行: "SUBSTRING(Convert(Created, 'System.String'),11,8) >= '" + cStartTime + "'" 这应该将DateTime转换为System.String,将time元素提取为8个字符的子字符串,并将其与已知的字符串值cStartTime(例如22:00:0

我在DataTable中创建了名为Created的DataColumn,类型为DateTime,并创建了一个RowFilter表达式,以仅返回在任何一天的晚上10点之后创建的行:

"SUBSTRING(Convert(Created, 'System.String'),11,8) >= '" + cStartTime + "'"

这应该将DateTime转换为System.String,将time元素提取为8个字符的子字符串,并将其与已知的字符串值cStartTime(例如22:00:00)进行比较。它应该返回一行,但不返回任何行。

不要使用这种方法,将日期时间转换为字符串并使用子字符串非常容易出错,而且不可读,即使它现在可以工作,将来也可能会中断。如果系统使用不同的区域性。相反,我建议使用Linq到DataTable:


如果需要数据行[],请使用filtered.ToArray。如果需要新的数据表,请使用filtered.CopyToDataTable。

那么cStartTime是字符串22:00:00?是的,是字符串。正如蒂姆·施梅尔特指出的那样,这可能是一个问题。真遗憾!我正在使用Vulcan.NET,它还没有处理Linq。这是一种很好的语言,但还没有完全达到C语言的速度。但是,关于文化差异有一个很好的观点。但它无论如何都不起作用,所以容易出错似乎是真的。谢谢AJB。
var filtered = from row in dataTable.AsEnumerable()
               let created = row.Field<DateTime>("Created")
               where created.Hour >= 22
               select row;