BindingSource Фильтр по дате

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

Дата в базе данных содержит такие значения: 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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
28 945
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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-запросов, особенно непосредственно из пользовательского ввода, и, более того, возникнет огромная проблема с форматированием.

Gar 15.08.2016 16:09

Другие вопросы по теме