c# - DataTable.Select 将 DateTime 存储为字符串
问题描述
我有DataTable
一个DateTime
存储为string
“20.12.2017”的存储。我想选择过去 6 个月内的所有行。
我可以这样做foreach
:
foreach (DataRow dr in dsErgebnisse.Tables[0].Rows)
{
if (Convert.ToDateTime(dr[6].ToString()) > DateTime.Now.AddMonths(-6))
{
dsTemp.Tables[0].ImportRow(dr);
}
}
这给了我 3.613 行。
我尝试通过选择来检查它是否更快:
DataRow[] foundRows = dsErgebnisse.Tables[0].Select("DATUM > '" + DateTime.Now.AddMonths(-6).ToShortDateString() + "'");
DATUM
是我DateTime
存储为字符串的列。这给了我 2.624 行。
为什么有区别?我尝试在 select 语句中使用 convert 但我失败了System.Data.EvaluateException
:
foundRows = dsErgebnisse.Tables[0].Select("Convert(DATUM, 'System.DateTime') > '" + DateTime.Now.AddMonths(-6).ToShortDateString() + "'");
解决方案
- 规则 0:停止使用
DataTable
……永远* - 规则 1:不要将日期/时间值存储为字符串;将它们存储为
DateTime
或类似 - 规则 2:如果您忽略规则 0 和 1,请确保将它们存储在可排序的顺序中,例如“2017-12-20”
由于您已经违反了所有这些规则,因此大多数赌注都失败了,您可能必须通过迭代行、获取值并进行自己的转换来手动进行过滤。LINQ via.AsEnumerable()
可能会有所帮助;它当然不能让它变得更糟:)
*=在适当的地方有一小部分问题DataTable
;如果您提前知道数据的架构足以发出Select
查询:这不是其中之一
推荐阅读
- java - 为什么数组类型的类变量在声明后无法初始化,但可以在Java中的方法内部初始化?
- javascript - Photoshop JavaScript (ExtendScript):如何在脚本完成之前显示图层?
- rxjs - Visual Studio AppCenter 构建失败,Bash 以代码“1”退出
- c++ - 为同一向量 C++ 运行多个线程时出现分段错误
- matlab - 在 MATLAB 中将坐标显示为 surf
- javascript - Rails x JQuery 不显示图像
- spring-mvc - Hibernate JPA 返回重复记录
- android - 将改造错误作为 gson 模型处理
- laravel - 由于 dompdf,无法在 docker 上安装 laravel/cashier
- spring - Thymeleaf switch block returns incorrect value