|
2022/10/12(Wed) 14:27:19 編集(投稿者)
■No100673 (魔界の仮面弁士) に追記 > ここでいう「一ヶ月」はどういう定義付けになりますか? > 30日後、とかであれば TimeSpan 値を日付値に加算すれば済みますが > 閏年や末日判定なども考慮が必要な要件だと、式列仕様では煩雑なので、 > DataView ではなく LINQ で抽出したほうが融通が利くでしょう。
ということで、『(col1 の一ヶ月前) ≦ (col2)』なレコードを LINQ を使って、DataView として抽出してみました。
「一ヶ月前」の算出を .AddMonths(-1R) で行っているため、 col2 <= 20221028 の行が取得される条件は、 col1 <= 20221129 の時 col2 <= 20221029 の行が取得される条件は、 col1 <= 20221130 の時 col2 <= 20221030 の行が取得される条件は、 col1 <= 20221130 の時 col2 <= 20221031 の行が取得される条件は、 col1 <= 20221130 の時 col2 <= 20221201 の行が取得される条件は、 col1 <= 20221201 の時 という結果になります。末日判定などが期待と異なる場合は、適宜調整してみてください。
Dim dt1 As New DataTable("ぽん") dt1.Columns.Add("ID", GetType(Integer)).AllowDBNull = False dt1.Columns.Add("col1", GetType(String)) dt1.Columns.Add("col2", GetType(String)) dt1.PrimaryKey = New DataColumn() {dt1.Columns("ID")}
dt1.Rows.Add(2110, "20221129", "20221028") '× 除外 dt1.Rows.Add(2120, "20221129", "20221029") '◎ dt1.Rows.Add(2130, "20221129", "20221030") '◎ dt1.Rows.Add(2140, "20221129", "20221031") '◎ dt1.Rows.Add(2150, "20221129", "20221101") '◎ dt1.Rows.Add(2160, "20221129", "20221102") '◎
dt1.Rows.Add(2210, "20221130", "20221028") '× 除外 dt1.Rows.Add(2220, "20221130", "20221029") '× 除外 dt1.Rows.Add(2230, "20221130", "20221030") '◎ dt1.Rows.Add(2240, "20221130", "20221031") '◎ dt1.Rows.Add(2250, "20221130", "20221101") '◎ dt1.Rows.Add(2260, "20221130", "20221102") '◎
dt1.Rows.Add(2310, "20221201", "20221028") '× 除外 dt1.Rows.Add(2320, "20221201", "20221029") '× 除外 dt1.Rows.Add(2330, "20221201", "20221030") '× 除外 dt1.Rows.Add(2340, "20221201", "20221031") '× 除外 dt1.Rows.Add(2350, "20221201", "20221101") '◎ dt1.Rows.Add(2360, "20221201", "20221102") '◎
dt1.AcceptChanges()
Dim c = System.Globalization.CultureInfo.InvariantCulture Dim s = System.Globalization.DateTimeStyles.None Dim ToDate As Func(Of DataRow, String, Date?) = Function(row, colName) Dim d As Date Return If(Date.TryParseExact(row.Field(Of String)(colName), "yyyyMMdd", c, s, d), d, New Date?()) End Function
Dim dv As DataView = dt1.AsEnumerable().Where(Function(r) If(ToDate(r, "col1")?.AddMonths(-1.0R) <= ToDate(r, "col2"), False)).AsDataView()
|