DataTable.Select ведет себя странно, используя оператор ISNULL в столбце NULL DateTime - PullRequest
0 голосов
/ 11 мая 2010

У меня есть DataTable со столбцом DateTime, DateCol, который может быть DBNull. DataTable содержит одну строку со значением NULL в этом столбце.

Я пытаюсь запросить строки, имеющие значение DBNull в этом столбце или дату, превышающую сегодняшнюю дату. Сегодняшняя дата 5/11/2010. Я построил запрос для выбора нужных мне строк, но он не сработал так, как ожидалось. Запрос был:

string query = "ISNULL(DateCol, '" + DateTime.MaxValue + "'") > "' + DateTime.Today "'"

Это приводит к следующему запросу:

"ISNULL(DateCol, '12/31/9999 11:59:59 PM') > '5/11/2010'"

Когда я запускаю этот запрос, я не получаю результатов. Мне понадобилось время, чтобы понять, почему. Далее следует мое расследование в непосредственном окне Visual Studio:

> 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

В настоящее время региональные настройки моего аппарата установлены на EN-US, а формат короткой даты - M / d / yyyy.

Почему исходный запрос дал неправильные результаты?

Почему это работает нормально, если сравнивать дату с 31.01.2000, но не с 01.02.2000?

1 Ответ

4 голосов
/ 12 мая 2010

Формат выражения запроса использует # ... # для значений DateTime. Одиночные кавычки используются для строковых значений. В выражениях, где вы используете одинарные кавычки вокруг DateTime, выполняется сравнение строк, в котором символ «1» в «31.12.9999» стоит перед «5» в «5/11/2010» и "2" в "1/2/2000", но не "1" в "31.01.2000", в порядке Unicode.

...