DataTable.Ошибка выбора выражения с использованием фильтра DateTime equals

#c# #.net #ado.net

#c# #.net #ado.net

Вопрос:

У меня есть некоторые данные, извлеченные из базы данных, которые я храню в таблице данных. Что я хочу сделать, так это извлечь только записи, которые соответствуют дате, переданной в качестве параметра, только если она больше DateTime.MinValue(). Это должно быть легко.

Ниже приведен фрагмент кода того, как я создаю строку запроса. Я знаю, что если у меня нет фильтра по дате, я получаю записи ‘x’, но я всегда получаю 0 с фильтром по дате.

     string query = string.Format("Field_Name IN( 'GENDER','DOB','MARITAL_STATUS','SS') AND DIFF_TYPE = 'PER' AND Person_ID = '{0}'", Person_ID);

    if (ChangeDetected > DateTime.MinValue)
    {
        query  = string.Format(" AND ChangeToDT = #{0}#", ChangeDetected);
    }

    ChangeDataSet.DifferencesRow[] perChanges = this.m_ChangeDS.Differences.Select(query, "ChangeFromDT ASC, Field_Name DESC") as ChangeDataSet.DifferencesRow[];
  

Я пробовал всевозможные варианты формата вывода для DateTime в фильтре, но все они дают одинаковый результат.

Я также недостаточно знаю LINQ, чтобы выполнить условный фильтр таким образом. {:o(

Ответ №1:

Попробуйте указать формат напрямую:

 query  = string.Format(" AND ChangeToDT = #{0}#", ChangeDetected.ToString("MM/dd/yyyy"));
  

Кстати: это не имеет никакого отношения к LINQ.

Комментарии:

1. Это сработало!!! По какой-то причине сравнение DateTime требует, чтобы оно было приведено к строке в формате US. Спасибо.

2. Кстати, я знаю, что это не LINQ, но коллега сказал мне, что это было бы легко сделать в LINQ… Хотя у него «Не было времени» показать мне, как это сделать.

3. Я также замечаю, что «=» не работает, поэтому необходимо выполнить следующее: запрос = строка. Format(» И (ChangeToDT >= #{0}# И ChangeToDT <= #{1}#)», Обнаружено изменение. Добавить минуты(-1). toString(«ММ / дд/гггг ЧЧ: мм»), обнаружено изменение. Добавьте минуты (1). toString(«ММ / дд/гггг ЧЧ: мм»));

4. = Работает, если ChangeToDT указана только дата. Если оно также содержит время, было бы разумнее удалить его, если вас это не волнует.