1

次の DataView.Rowfilter フィルターでは、Request_Date は smalldatetime です。

dv.RowFilter = "Request_Date >= '01/01/2012' and Request_Date <= '12/31/2012'"

これに関する問題は、smalldatetime がMM/dd/yyyy hh:mm:ssであるということですが、形式が の文字列と比較されます'MM/dd/yyyy'。これは、フィルターが文字列を自動的に smalldatetime に変換することを意味するため、比較では 2012 年 1 月 1 日午前 12 時から 2012 年 12 月 31 日午前 12 時までの日付/時刻のみが表示されます。2012 年 12 月 31 日以降の日付を含む行は、このフィルターによって取得されません。終了日に 1 日を追加するか、たとえば 12:59:59 を日付の最後に連結して、その日の他の時間を取得できることはわかっていますが、よりエレガントなものを期待していました。同等のSQLの... CONVERT(smalldatetime, Request_Date, 101) <= '12/31/2012'. DataView フィールドの別の日付形式を取得する方法はありますか、または比較の前に終了日をマッサージすることはできますか?

参考までに、現在の最良のオプションは次のとおりです。

dv.RowFilter = "Request_Date >= #" & dtpStartDate.DateText & "# and Request_Date <= #" & DateAdd(DateInterval.Day, 1, dtpEndDate.DateValue) & "#"

ご協力いただきありがとうございます!

4

2 に答える 2

1

少なくとも.NET3.5を使用している場合は、Linq-To-DataSetより読みやすいものを使用できます。

DataTable filtered = dv.Table
          .AsEnumerable()
          .Where(r => r.Field<DateTime>("Request_Date") >= dtpStartDate.Value
                   && r.Field<DateTime>("Request_Date") < dtpEndDate.Value.AddDays(1))
          .CopyToDataTable();

using.System.Linq;への参照を追加しSystem.Data.DataSetExtensions.dllます。

編集:VB.NETがタグ付けされているのを見たばかりです:

Dim filtered = From row In dv.Table
           Where row.Field(Of DateTime)("Request_Date") >= dtpStartDate.Value AndAlso _
                 row.Field(Of DateTime)("Request_Date") < dtpEndDate.Value.AddDays(1)
Dim tblFiltered = filtered.CopyToDataTable()
于 2012-10-18T20:35:10.157 に答える
0

「<= 12/31/2012」を使用する代わりに、単に「< 1/1/2013」を使用してください。これが最もエレガントで、まさにあなたが望むものを得ることができます。

于 2013-01-03T12:39:20.917 に答える