Вопрос

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

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

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

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

P.S.Я использую базу данных MYSQL с соединителем/сетью 5.2.

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

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

Это было полезно?

Решение

Функция 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));

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

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

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

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

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";
}

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

yyyy-mm-dd

должен был бы быть заработанным таким образом;

yyyy-MM-dd

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

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

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

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

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

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

Источник привязки1:моя загрузка источника данных datagridview в BindingSource1 .Ф5:имя столбца заголовка в datagridview.маскированныйTextBox1:для первого свидания.маскированныйTextBox2:для второго свидания.

Будь успешным "Арн_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 .
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top