BindingSource Фильтр по дате - PullRequest
5 голосов
/ 30 декабря 2008

Я хочу отфильтровать значения из базы данных по дате.

Дата в базе данных содержит такие значения: 2008-12-28 18:00:00. И у моего класса есть переменная DateTime, в зависимости от которой я хочу фильтровать. В идеале это будет работать так: myBindingSource.Filter = "DATE(myDateField) = myDateTime.Date" + настройка формата myDateTime.Date по мере необходимости.

Но выдается исключение EvaluateException: «Выражение содержит неопределенный вызов функции DATE ().»

Хотя, если я выполняю оператор SQL напрямую, я могу использовать функцию DATE () в фильтре.

P.S. Я использую MYSQL DB с Connector / Net 5.2

Как я могу решить эту проблему?

Спасибо всем за предложения.

Ответы [ 7 ]

13 голосов
/ 12 февраля 2009

Функция 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));
2 голосов
/ 30 декабря 2008

Спасибо, Том Х.

Да, я хотел исключить временную часть даты и времени в фильтре, и ваше предложение работает отлично.

Я оставлю полное решение для других:

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";
}
1 голос
/ 30 июня 2009

Исправление к ответу: По MSDN , чтобы получить правильную дату мм в

yyyy-mm-dd

должно быть написано с заглавной буквы вот так;

yyyy-MM-dd

чтобы получить правильно отформатированную дату.

0 голосов
/ 15 августа 2016

Для поиска между двумя датами в DataGridView вы можете использовать этот код:

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

BindingSource1: моя загрузка источника данных сетки просмотра в BindingSource1. F5: имя вашего столбца заголовка в datagridview. maskedTextBox1: для получения первого свидания. maskedTextBox2: для получения второго свидания.

Будь успешным "Арн_7"

0 голосов
/ 15 августа 2016

Для поиска между двумя датами в 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 .
0 голосов
/ 30 декабря 2008

Вы спрашиваете, как исключить часть времени datetime в фильтре? Я не слишком знаком с MySQL, но если вы используете какую-либо функцию, которая возвращает часть даты datetime, то вы, скорее всего, упустите шанс использовать индекс для этого столбца для запроса (существующий или будущий индекс).

Лучше всего создать на внешнем интерфейсе фильтр, который проверяет диапазон, который соответствует только указанной дате фильтра. Например:

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 # потребовал бы от меня гораздо больше времени, чтобы придумать функции, чем, вероятно, потребовалось бы вам. :)

0 голосов
/ 30 декабря 2008

Является ли myDateField именем поля в наборе данных? Я думаю, вы хотите выражение, подобное этому:

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