DataTable.Выберите ведущий странно с помощью оператора isnull на столбце NULL DATETIME
-
26-09-2019 - |
Вопрос
У меня есть DataTable с столбцом DateTime, «Datecol», который может быть добулле. DataTable имеет одну строку в нем с нулевым значением в этом столбце.
Я пытаюсь запросить строки, которые имеют значение DBNull в этом столбце, либо дату, которая больше, чем сегодняшняя дата. Сегодняшняя дата 5/11/2010. Я построил запрос, чтобы выбрать строки, которые я хочу, но он не работал, как ожидалось. Запрос был:
string query = "ISNULL(DateCol, '" + DateTime.MaxValue + "'") > "' + DateTime.Today "'"
Это приводит к следующему запросу:
"ISNULL(DateCol, '12/31/9999 11:59:59 PM') > '5/11/2010'"
Когда я запускаю этот запрос, я не получаю результатов. Мне потребовалось некоторое время, чтобы выяснить, почему. Далее следует мое расследование в визуальной студии немедленного окна:
> dt.Rows.Count 1 > dt.Rows[0]["DateCol"] {} > dt.Rows[0]["DateCol"] == DBNull.Value true > dt.Select("ISNULL(DateCol,'12/31/9999 11:59:59 PM') > '5/11/2010'").Length 0 <-- I expected 1
Испытание и ошибка показали разницу в проверках даты на следующей границе:
> dt.Select("ISNULL(DateCol, '12/31/9999 11:59:59 PM') > '2/1/2000'").Length 0 > dt.Select("ISNULL(DateCol, '12/31/9999 11:59:59 PM') > '1/31/2000'").Length 1 <-- this was the expected answer
Запрос работает нормально, если я обернутую поле DateTime в # вместо кавычек.
> dt.Select("ISNULL(DateCol, #12/31/9999#) > #5/11/2010#").Length 1
Региональные настройки My Machine в настоящее время настроены на UN-US, а формат короткого дата - M / D / Yyyy.
Почему первоначальный запрос вернет неправильные результаты?
Почему это работает нормально, если дата сравнивалась с 1/31/2000, но не против 2/1/2000?
Решение
Формат выражения запроса использует # ... # для значений DateTime. Одиночные кавычки используются для строковых значений. В выражениях, где вы используете отдельные цитаты вокруг DateTime, он выполняет строковое сравнение, в котором символ «1» в «12/31/9999» приходит до «5» в «5/11/2010» и «2» в «2/1/2000», но не «1» в «1/31/2000», в порядке Unicode.