0

我有一个带有 DateTime 列“DateCol”的 DataTable,它可以是 DBNull。DataTable 中有一行,该列中有一个 NULL 值。

我正在尝试查询在此列中具有 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

如果我将 DateTime 字段包含在 # 而不是引号中,则查询可以正常工作。

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

我机器的区域设置目前设置为EN-US,短日期格式为M/d/yyyy。

为什么原始查询返回错误的结果?

如果将日期与 2000 年 1 月 31 日而不是 2000 年 2 月 1 日进行比较,为什么它会正常工作?

4

1 回答 1

4

查询表达式格式使用 #...# 作为 DateTime 值。单引号用于字符串值。在您在 DateTime 周围使用单引号的表达式中,它正在进行字符串比较,其中“12/31/9999”中的字符“1”位于“5/11/2010”中的“5”之前,并且“2/1/2000”中的“2”,但不是“1/31/2000”中的“1”,按 Unicode 顺序排列。

于 2010-05-11T20:39:03.850 回答