我有一个DataTable与日期时间列,“DateCol”,即可以是为DBNull。数据表中有一列与该列中一个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日相比?

有帮助吗?

解决方案

在查询表达式格式使用#...#为DateTime值。单引号用于字符串值。在您使用周围的DateTime单引号的表达,它是做一个字符串比较,其中在“12/31/9999”字符“1”,在“2010/5/11”到来之前的“5”和的“2”中的“2000年2月1日”,而不是“1”中的“2000年1月31日”,以Unicode顺序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top