BindingSource 按日期筛选

Posted

技术标签:

【中文标题】BindingSource 按日期筛选【英文标题】:BindingSource Filter by date 【发布时间】:2010-09-28 20:30:51 【问题描述】:

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

数据库中的日期包含如下值:2008-12-28 18:00:00。我的班级有一个 DateTime 变量,具体取决于我要过滤的内容。理想情况下,它会像这样工作: myBindingSource.Filter = "DATE(myDateField) = myDateTime.Date" + 根据需要调整 myDateTime.Date 格式。

但它会抛出 EvaluateException:“表达式包含未定义的函数调用 DATE()。”

虽然如果我直接执行SQL语句,我可以使用过滤器中的DATE()函数。

附:我将 mysql DB 与 Connector/Net 5.2 一起使用

我该如何解决这个问题?

谢谢大家的建议。

【问题讨论】:

【参考方案1】:

不需要getSqlDate 函数。您可以使用 String.Format() 来格式化日期:

String.Format("0:yyyy-MM-dd 00:00:00", myDateTime)

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));

【讨论】:

【参考方案2】:

谢谢汤姆 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";

【讨论】:

【参考方案3】:

对答案的更正: 根据msdn , 得到正确的日期

中的mm
yyyy-mm-dd

必须大写 像这样;

yyyy-MM-dd

获取格式正确的日期。

【讨论】:

【参考方案4】:

myDateField 是数据集中字段的名称吗?我想你想要这样的表达方式:

myBindingSource.Filter = "myDateField = " & myDateTime.Date.ToString()

【讨论】:

【参考方案5】:

您是在问如何消除过滤器中日期时间的时间部分?我对 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# 技能,这需要我花更多的时间来设计函数,而这可能需要你花很多时间。 :)

【讨论】:

【参考方案6】:

要在 DataGridView 中的两个日期之间进行搜索,您可以使用以下代码:

BindingSource1.Filter = "F5 >= '" + maskedTextBox1.Text + "' And " + "F5 <= '" + maskedTextBox2.Text + "'";

BindingSource1 :我的 datagridview 数据源加载到 BindingSource1 中。 F5:datagridview 中标题列的名称。 maskedTextBox1:用于获取第一个日期。 maskedTextBox2 : 用于获取第二个日期。

成功“Arn_7”

【讨论】:

不,你不能这样做,你能检查你的答案吗?你不应该使用连接来构造 sql 查询,特别是直接从用户输入,而且,会有一个巨大的格式问题。【参考方案7】:

要在 DataGridView 中的两个日期之间进行搜索,您可以使用以下代码:

BindingSource1.Filter = "F5 >= '" + maskedTextBox1.Text + "' And " + "F5 <= '" + maskedTextBox2.Text + "'";

BindingSource1 : my datagridview datasourc load in BindingSource1 .
F5             : name of your header column in datagridview . 
maskedTextBox1 : for get first date .
maskedTextBox2 : for get second date .

【讨论】:

【参考方案8】:

您需要添加像“'2021-09-26'”这样的单引号。

myBindingSource.Filter = "myDateField = " + "'" + myDateTime.Date.ToString("yyyy-MM-dd") + "'"

【讨论】:

以上是关于BindingSource 按日期筛选的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 按日期筛选结果返回 0 个结果

无法在 Azure SQL 跨数据库查询中按日期时间类型进行筛选

在实体框架中使用 bindingSource 的过滤器

如何使用函数匹配指定日期在另一个表日期范围内对应的数据?

是否可以让日期数据类型接受 13 作为一个月和 30 作为所有月份?

excel改的日期格式为啥要双击一下单元格才能变