我有一个带有DateTime列的DataTable,“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。
为什么原始查询会返回错误的结果?
如果将日期与2000年1月31日进行比较而不是与2/1/2000进行比较,为什么它能正常工作?
答案 0 :(得分:4)
查询表达式格式使用#...#作为DateTime值。单引号用于字符串值。在DateTime周围使用单引号的表达式中,它正在进行字符串比较,其中“12/31/9999”中的字符“1”位于“5/11/2010”中的“5”之前, “2/1/2000”中的“2”,但不是“1/31/2000”中的“1”,按Unicode顺序排列。