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 日とは比較されない場合、なぜ正常に機能するのでしょうか?