DataTable.Выберите ведущий странно с помощью оператора isnull на столбце NULL DATETIME

StackOverflow https://stackoverflow.com/questions/2812383

Вопрос

У меня есть 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top