0

DBNull の可能性がある DateTime 列「DateCol」を持つ DataTable があります。DataTable には、この列に NULL 値を持つ行が 1 つあります。

この列に 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 に答える