0

我希望有人可以提供帮助,我已经为此苦苦挣扎了几天。

我正在尝试使用 rowfilter 过滤掉一些记录,该 rowfilter 在超过 15 分钟前的列之一中具有日期时间,看着它,这在我看来好像它会这样做:

    Dim TimeStr As String
    TimeStr = String.Format(CultureInfo.InvariantCulture, "#{0}#", Now.AddMinutes(-15))
    AlertsView.RowFilter = "StatusId < 3 AND LastEmailed < " & TimeStr

在过滤器之前,视图中有 6 行,但在过滤器之后没有,我知道 StatusId 字段是正确的,就好像我过滤它工作正常一样。所有 6 行的 LastEmailed 值为 2013-09-03 23:06:44.813

我认为这可能与字符串转换有关,但我被卡住了。

非常感谢

4

1 回答 1

1

表达式中两个#字符之间的任何内容RowFilter最终都将传递给DateTime.Parse(s, CultureInfo.InvariantCulture).

这应该在MSDN 文档中提到DataColumn.Expression,但事实并非如此。但是,如果您深入挖掘,您可以在内部类System.Data.ConstNode的构造函数中找到它。

因此,只要您在不变的文化中生成明确的值,就应该没问题。为了安全起见,您可能希望使用"s"格式说明符为您提供类似2013-12-31T12:34:56. 将格式字符串更改为"#{0:s}#".

或者更清洁:

Dim TimeStr As String
TimeStr = Now.AddMinutes(-15).ToString("s", CultureInfo.InvariantCulture)
AlertsView.RowFilter = "StatusId < 3 AND LastEmailed < #" & TimeStr & "#"

String.Format在这里买的不多。

另外-只是出于好奇,您确定不是将苹果与橙子进行比较吗?数据库将 UTC 时间存储在LastEmailed. 您可能需要使用DateTime.UtcNow而不是 just Now(这是 的别名DateTime.Now)。

于 2013-09-05T17:52:46.497 回答