Я хочу фильтровать значения из базы данных по дате.
Дата в базе данных содержит такие значения: 2008-12-28 18:00:00. И у моего класса есть переменная DateTime, в зависимости от того, что я хочу фильтровать. В идеале это должно было бы работать так:
myBindingSource.Filter = "DATE(myDateField) = myDateTime.Date" + настройка формата myDateTime.Date по мере необходимости.
Но это вызывает исключение EvaluateException: «Выражение содержит неопределенный вызов функции DATE ()».
Хотя, если я выполняю оператор SQL напрямую, я могу использовать функцию DATE () в фильтре.
P.S. Я использую базу данных MYSQL с Connector / Net 5.2
Как я могу решить эту проблему?
Спасибо всем за предложения.





MyDateField - это имя поля в наборе данных? Думаю, вам нужно такое выражение:
myBindingSource.Filter = "myDateField = " & myDateTime.Date.ToString()
Вы спрашиваете, как убрать временную часть даты и времени в фильтре? Я не слишком знаком с 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# потребовало бы от меня гораздо больше времени, чтобы придумать функции, чем это, вероятно, займет вы. :)
Спасибо, Том Х.
Да, я хотел удалить временную часть даты и времени в фильтре, и ваше предложение отлично работает.
Я оставлю готовое решение другим:
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";
}
Функция 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));
Исправление к ответу: Согласно msdn , чтобы получить правильную дату мм в
yyyy-mm-dd
должно быть написано с заглавной буквы вот так;
yyyy-MM-dd
чтобы дата была правильно отформатирована.
Для поиска между двумя датами в 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 .
Для поиска между двумя датами в DataGridView вы можете использовать этот код:
BindingSource1.Filter = "F5 >= '" + maskedTextBox1.Text + "' And " + "F5 <= '" + maskedTextBox2.Text + "'";
BindingSource1: моя загрузка datagridview datasourc в BindingSource1. F5: имя столбца заголовка в datagridview. maskedTextBox1: для получения первого свидания. maskedTextBox2: для получения второго свидания.
Будь успешным "Арн_7"
Нет, вы не можете этого сделать, не могли бы вы повторить свой ответ? вам не следует использовать конкатенацию для построения sql-запросов, особенно непосредственно из пользовательского ввода, и, более того, возникнет огромная проблема с форматированием.