需要循环显示日期记录才能计算工作天数。日期的数量因人而异,它们可能只有一个或多达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
这是整个功能代码,希望这更有意义。
答案 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作为字段名称。