2010-05-11 6 views
0

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

Я пытаюсь запросить строки, которые имеют значение 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/гггг.

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

Зачем это работать, если дата была сопоставлена ​​с 31.01.2000, но не против 2/1/2000?

ответ

4

Формат выражения запроса использует # ... # для значений DateTime. Для строковых значений используются одинарные кавычки. В выражениях, в которых вы используете одиночные кавычки вокруг DateTime, он выполняет сравнение строк, в котором символ «1» в «12/31/9999» предшествует «5» в «5/11/2010» и «2» в «2/1/2000», но не «1» в «1/31/2000», в порядке Юникод.

+0

спасибо, что имеет смысл. –