3

アクセスが難しい質問があります。行き詰まっているようです。私のデータは下の表のようなもので、各人には開始日と終了日、およびその 2 つの間の日数があります。私がやろうとしているのは、連続するすべての割り当ての長さを合計することです。つまり、1 つの終了日は次の開始日の前日です。以下の例では、終了日と開始日の間に休憩があるため、レコード 1、2、3 の割り当ての長さを合計し、個別に 4、5 を合計します。アクセスできるので、クエリまたはvbaで実行できますが、ここでの最適な解決策はわかりません。
ID 名 StartDate EndDate AssignmentLength
1 -- bob -- 1/1/2013 -- 2/1/2013 -- 30
2 -- bob -- 2/2/2013 -- 3/1/2013 -- 30
3 -- ボブ -- 3/2/2013 -- 4/1/2013 -- 30
4 -- ボブ -- 5/1/2013 -- 6/1/2013 -- 30
5 -- ボブ -- 6/ 2013 年 2 月 -- 2013 年 7 月 1 日 -- 30

4

3 に答える 3

2

指定されたデータに追加のレコードを追加しました。

periodID    fname   startdate   enddate
6           bob     8/1/2013    9/1/2013

レコードにまたがらないピリオドを 1 つ持つこと。テーブルに workperiods という名前を付けました。

変更されたデータを使用すると、作業期間が次のように始まることがわかります。

SELECT *
FROM workperiods
WHERE periodid NOT IN
    (SELECT a.periodid
     FROM workperiods a
     INNER JOIN workperiods b ON a.startdate =b.enddate+1);

作業期間が次で終了することがわかります

SELECT *
FROM workperiods
WHERE periodid NOT IN
    ( SELECT a.periodid
     FROM workperiods a
     INNER JOIN workperiods b ON a.enddate =b.startdate-1);

次に、この怪物を構築できます。

SELECT startdate,
       enddate,
       enddate-startdate AS periodlength
FROM
  (SELECT startdate,
          min(enddate) AS enddate
   FROM
     (SELECT c.startdate,
             f.enddate
      FROM
        (SELECT *
         FROM workperiods
         WHERE periodid NOT IN
             (SELECT a.periodid
              FROM workperiods a
              INNER JOIN workperiods b ON a.startdate =b.enddate+1)) AS c,

        (SELECT *
         FROM workperiods
         WHERE periodid NOT IN
             (SELECT d.periodid
              FROM workperiods d
              INNER JOIN workperiods e ON d.enddate =e.startdate-1)) AS f
      WHERE f.startdate >c.enddate
        OR c.startdate=f.startdate)
   GROUP BY startdate)

これにより、次のことが得られます。

startdate   enddate     periodlength
1/1/2013    4/1/2013    90
5/1/2013    7/1/2013    61
8/1/2013    9/1/2013    31

これは望ましい結果かもしれません。

きれいではありませんが、そこに到達すると思います。

于 2013-06-12T16:35:47.673 に答える
1

VBA とDateDiff()を使用します。次に、それぞれをループして比較し、合計が 1 未満かどうかを確認できます。

于 2013-06-12T15:04:06.390 に答える
1

ここから何かアイデアが得られるかもしれません。AssignmentLength は、実際の月の長さに合わせて変更できます。アイデアがあれば、回答済みとしてマークしてください。

Sub dates()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim ConnStr As String
''Dim below arrays
Set cn = New ADODB.Connection
ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
    "C:\Users\Philosophaie\Documents\a  access\a Chase.mdb;"
cn.Open ConnStr
Set rs = New ADODB.Recordset
rs.Open Source:="Checking", ActiveConnection:=cn, _
    CursorType:=adOpenKeyset, LockType:=adLockOptimistic, _
    Options:=adCmdTableDirect
rs.MoveFirst
Do Until rs.EOF
   If rs!Name = "bob" Then
       n=n+1
       datestart(n)=rs!StartDate
       dateend(n)=rs!EndDate
       assignmentlength(n)=rs!AssignmentLength
    End If
    rs.MoveNext
Loop
for i=1 to n
    mostart(i)=Left(datestart(i),1)
    dystart(i)=right(left(datestart,3),1)
    yrstart(i)=right(datestart,4)
''do the same for end
next I
for i=1 to n
    if moend(I)=mostart(i) then
        if dyend(I)=daystart(I)+1 then
           if yrend(I)=yrstart(I) then
              aslen(j)=assignmentlength(I)+aslen(j)
           else
              j=j+1
           end if
        else
              j=j+1
        end if
    else
        j=j+1
    end if
  next I
''output
End sub
于 2013-06-12T15:41:46.487 に答える