我想根据日期过滤数据库中的值。
数据库中的日期包含如下值:2008-12-28 18:00:00。我的类有一个DateTime变量,具体取决于我想要过滤的内容。理想情况下它会像这样工作:
myBindingSource.Filter = "DATE(myDateField) = myDateTime.Date"
+根据需要调整myDateTime.Date格式。
但它抛出一个EvaluateException:“表达式包含未定义的函数调用DATE()。”
虽然如果我直接执行SQL语句,我可以在filter中使用DATE()函数。
P.S。我使用MYSQL DB和Connector / Net 5.2
我该如何解决这个问题?
谢谢大家的建议。
答案 0 :(得分:13)
不需要getSqlDate函数。您可以使用String.Format()格式化日期:
String.Format("{0:yyyy-MM-dd} 00:00:00", myDateTime)
OR
myDateTime.Date.ToString("yyyy-MM-dd") + " 00:00:00"
您可以像这样过滤绑定源:
myBindingSource.Filter = String.Format("myDateField >= '{0:yyyy-MM-dd}' AND myDateField < '{1:yyyy-MM-dd}'", myDateTime, myDateTime.AddDays(1));
答案 1 :(得分:2)
谢谢Tom H。
是的,我想消除过滤器中日期时间的时间部分,您的建议完美无缺。
我将为其他人留下完整的解决方案:
myBindingSource.Filter = "myDateField >= '" + getSqlDate(myDateTime) + "' AND myDateField < '" + getSqlDate(myDateTime.AddDays(1)) + "'";
其中getSqlDate函数是:
string getSqlDate(DateTime date) {
string year = "" + date.Year;
string month = (date.Month < 10) ? "0" + date.Month : "" + date.Month;
string day = (date.Day < 10) ? "0" + date.Day : "" + date.Day;
return year + "-" + month + "-" + day + " 00:00:00";
}
答案 2 :(得分:1)
答案 3 :(得分:0)
myDateField是数据集中字段的名称吗?我想你想要一个这样的表达式:
myBindingSource.Filter = "myDateField = " & myDateTime.Date.ToString()
答案 4 :(得分:0)
您是否在询问如何消除过滤器中日期时间的时间部分?我不太熟悉MySQL,但是如果你使用任何类型的函数返回日期时间的日期部分,那么你很可能会杀死在该列上使用索引查询的任何机会(现有或未来的索引)。
最好的办法是在前端创建一个过滤器,用于检查仅适用于给定过滤日期的范围。例如:
myBindingSource.Filter = "myDateField >= " & <code to create a string representing 12AM of your date> &
" myDateField < " & <code to create a string for 12AM of the next day>
很抱歉没有确切的代码,但我是一名SQL开发人员而且我缺乏VB / C#技能需要我花更多的时间来提出这些功能然后它可能会带你。 :)