动态月份的工作日数

时间:2019-02-13 13:04:47

标签: ms-access access-vba

我需要在Access中报告每个员工有多少加班。因为有些作品从Mo-Th 10h和Fr 0h开始起作用,所以我不能说

  

计算8h以上的所有内容。

因此,我每个月需要所有工作日* 8h,并将其与我按月求和的实际工作时间(已经工作!)进行比较

解决方法:

 SELECT Format([TaetigkeitsDatum],"mmmm yy") AS Monat,  
 tbl_Taetigkeitserfassung.TaetigkeitsPersonalID,  
 Sum(tbl_Taetigkeitserfassung.TaetigkeitsStundenAnzeigen) AS  SummevonTaetigkeitsStundenAnzeigen
 FROM tbl_Taetigkeitserfassung
 GROUP BY Format([TaetigkeitsDatum],"mmmm yy"),  
 tbl_Taetigkeitserfassung.TaetigkeitsPersonalID;

这向我显示了格式化的Month(TaetigkeitsDatum),Employee(TaetigkeitsPersonalID)和工作时间总和(TaetigkeitsStundenAnzeigen)。

但是我不知道如何显示该月的工作日数,因此我可以比较和显示加班时间...

期望的解决方案:

1月19日:23天(无周末,假期无关紧要)* 8小时= 184小时 X先生的工作时间= 186h-> 2h加班

DateDiff无法正常工作,因为它需要2个日期才能工作,并且存在“仅计算工作日”问题。

1 个答案:

答案 0 :(得分:1)

您可以使用以下表达式:

WorkDays: ISO_WorkdayDiff(DateSerial(Year([TaetigkeitsDatum]), Month([TaetigkeitsDatum]), 1), DateSerial(Year([TaetigkeitsDatum]), Month([TaetigkeitsDatum]) + 1, 1))

和类似的功能:

Public Function ISO_WorkdayDiff( _
  ByVal datDateFrom As Date, _
  ByVal datDateTo As Date, _
  Optional ByVal booExcludeHolidays As Boolean) _
  As Long

' Purpose: Calculate number of working days between dates datDateFrom and datDateTo.
' Assumes: 5 or 6 working days per week. Weekend is (Saturday and) Sunday.
' May be freely used and distributed.

' 1999-04-23. Gustav Brock, Cactus Data ApS, Copenhagen
' 2000-10-03. Constants added.
'             Option for 5 or 6 working days per week added.
' 2008-06-12. Option to exclude holidays from the count of workdays.

  Const cbytWorkdaysOfWeek  As Byte = 5
  ' Name of table with holidays.
  Const cstrTableHoliday    As String = "tblHoliday"
  ' Name of date field in holiday table.
  Const cstrFieldHoliday    As String = "HolidayDate"

  Dim bytSunday             As Byte
  Dim intWeekdayDateFrom    As Integer
  Dim intWeekdayDateTo      As Integer
  Dim lngDays               As Long
  Dim datDateTemp           As Date
  Dim strDateFrom           As String
  Dim strDateTo             As String
  Dim lngHolidays           As Long
  Dim strFilter             As String

  ' Reverse dates if these have been input reversed.
  If datDateFrom > datDateTo Then
    datDateTemp = datDateFrom
    datDateFrom = datDateTo
    datDateTo = datDateTemp
  End If

  ' Find ISO weekday for Sunday.
  bytSunday = Weekday(vbSunday, vbMonday)

  ' Find weekdays for the dates.
  intWeekdayDateFrom = Weekday(datDateFrom, vbMonday)
  intWeekdayDateTo = Weekday(datDateTo, vbMonday)

  ' Compensate weekdays' value for non-working days (weekends).
  intWeekdayDateFrom = intWeekdayDateFrom + (intWeekdayDateFrom = bytSunday)
  intWeekdayDateTo = intWeekdayDateTo + (intWeekdayDateTo = bytSunday)

  ' Calculate number of working days between the two weekdays, ignoring number of weeks.
  lngDays = intWeekdayDateTo - intWeekdayDateFrom - (cbytWorkdaysOfWeek * (intWeekdayDateTo < intWeekdayDateFrom))
  ' Add number of working days between the weeks of the two dates.
  lngDays = lngDays + (cbytWorkdaysOfWeek * DateDiff("w", datDateFrom, datDateTo, vbMonday, vbFirstFourDays))

  If booExcludeHolidays And lngDays > 0 Then
    strDateFrom = Format(datDateFrom, "yyyy\/mm\/dd")
    strDateTo = Format(datDateTo, "yyyy\/mm\/dd")
    strFilter = cstrFieldHoliday & " Between #" & strDateFrom & "# And #" & strDateTo & "# And Weekday(" & cstrFieldHoliday & ", 2) <= " & cbytWorkdaysOfWeek & ""
    lngHolidays = DCount("*", cstrTableHoliday, strFilter)
  End If

  ISO_WorkdayDiff = lngDays - lngHolidays

End Function
相关问题