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