循环访问多个日期记录以查找天数

时间:2014-04-29 15:36:46

标签: sql function loops ms-access access-vba

需要循环显示日期记录才能计算工作天数。日期的数量因人而异,它们可能只有一个或多达11个,从序列中最后一个数据到当前日期的计算结束。

数据示例:

Employee No     Date     
4522            08/11/2011
4522            09/06/2011
4522            05/04/2013
4522            07/15/2013
4522            01/31/2014

所以今天是2014年4月29日,所以从2014年1月31日到2014年4月29日是88天,05/04/2013至2013年7月15日是72天和08/11/2011来09/06/2011是26天。将所有这些加在一起,你总共工作了186天。

在每种情况下,日期的数量也会有所不同。

这是我到目前为止所拥有的......

Sub getActualEmployment(empID As Variant)
  Dim strconnection, strSQL As String
  Dim conn As ADODB.Connection
  Dim tbl As ADODB.Recordset
  Dim OptimumCode As String
  Dim orghrdt As Date
  Dim intNumDays As Integer

  strSQL = "SELECT EmployeeID,EffectiveDate, OriginalHireDate FROM "
  strSQL = strSQL & "EmploymentStatusChanges WHERE EmployeeID= '" & empID & "'"
  strSQL = strSQL & " Order by EffectiveDate ASC"

  Set tbl = New ADODB.Recordset

  With tbl
    Set .ActiveConnection = conn
    .Source = strSQL
    .LockType = adLockOptimistic
    .CursorType = adOpenKeyset
    .CursorLocation = adUseClient
    .Open
  End With

  With tbl
    On Error Resume Next
    .MoveFirst
      Do Until tbl.EOF
        If tbl!OriginalHireDate = tbl!EffectiveDate Then
          orghrdt = tbl!EffectiveDate
        Else
          intNumDays = CInt(DateValue(tbl!EffectiveDate) - orghrdt)

        End If
        .MoveNext
      Loop
  End With

End Sub

这是整个功能代码,希望这更有意义。

2 个答案:

答案 0 :(得分:0)

首先要确保在调用MoveFirst方法并迭代记录集之前检查记录数以确保至少有一个记录。比依赖错误处理程序更好的做法。

当您说您想要前两个日期之间的天数时,您指的是列中的日期"日期"在第0行和第1行中,或者您指的是我们在图像中看不到的其他列中同一行中的日期?我假设还有其他日期列" OriginalHireDate"和" EffectiveDate"。

使用VB6中的DateDiff函数计算日期之间的差异。这里概述了:

http://www.chennaiiq.com/developers/reference/visual_basic/functions/datediff.asp

intNumDays = DateDiff("d", CDate(tbl!EffectiveDate), orghrdt)

这将返回tbl!EffectiveDate和orghrdt之间的天数。如果后者在前者之后,它将返回正数,如果前者在后者之后,则返回负数。

如果您可以澄清您的表格结构和之前的查询,我会看看我是否可以为您提供进一步的帮助。你应该能够实现你的目标,而无需遍历整个记录集。

答案 1 :(得分:0)

SELECT Employees.[Employee No], Employees.Action, Employees.DDate AS Start, Min(IIf([employees_1].[DDate]>=[employees].[ddate],[employees_1].[ddate])) AS [End], IIf([end] Is Not Null,[end],Now())-[start] AS Days
FROM Employees LEFT JOIN Employees AS Employees_1 ON Employees.[Employee No] = Employees_1.[Employee No]
WHERE (((Employees_1.Action)="term"))
GROUP BY Employees.[Employee No], Employees.Action, Employees.DDate
HAVING (((Employees.Action)="hire" Or (Employees.Action)="rehire"));

此查询提供所有租用事件和相应字词的列表,并列出每个事件的天数。在查看第一个查询结果后,您可以使用第二个查询来按员工对天数求和。

注意 - 这假设您有一组交替的雇用/终止事件。如果没有,您可能需要为此添加一些验证。另外,我认为Date是保留的,所以我使用DDate作为字段名称。