BindingSource按日期过滤

时间:2008-12-30 13:49:05

标签: c# sql filter filtering

我想根据日期过滤数据库中的值。

数据库中的日期包含如下值: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

我该如何解决这个问题?

谢谢大家的建议。

5 个答案:

答案 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)

对答案的更正: 符合msdn ,以获得正确的日期

中的 mm
yyyy-mm-dd

必须大写 像这样;

yyyy-MM-dd

获取格式正确的日期。

答案 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#技能需要我花更多的时间来提出这些功能然后它可能会带你。 :)