2010-05-11 60 views
0

我有一個DataTable,其DateTime列「DateCol」,可以是DBNull。 DataTable在其中有一行,在此列中有NULL值。DataTable.Select異常行爲在NULL DateTime上使用ISNULL運算符列

我正在試圖查詢在此列中具有DBNull值的行或大於今天日期的日期。今天的日期是2010年5月11日。我構建了一個查詢來選擇我想要的行,但它沒有按預期工作。查詢是:

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 

的查詢工作正常,如果我把#換成日期時間字段而不是引號。

> dt.Select("ISNULL(DateCol, #12/31/9999#) > #5/11/2010#").Length 
1 

我的機器的區域設置當前設置爲EN-US,和短日期格式是M/d/yyyy的。

爲什麼原始查詢返回錯誤的結果?

如果將日期與2000年1月31日進行比較,而不是2000年1月1日進行比較,爲什麼它可以正常工作?

回答

4

查詢表達式格式使用#...#表示DateTime值。單引號用於字符串值。在DateTime周圍使用單引號的表達式中,它將進行字符串比較,其中「12/31/9999」中的字符「1」位於「5/11/2010」中的「5」之前,並且「2/1/2000」中的「2」,而不是「1/31/2000」中的「1」,按Unicode順序。

+0

謝謝,這是有道理的。 – 2010-05-11 21:53:10