【问题标题】:Count the number of weekdays between two dates in visual basic在visual basic中计算两个日期之间的工作日数
【发布时间】:2011-07-15 16:36:18
【问题描述】:

我是一个 SQL 人,但我需要一个函数来计算 VB.NET 中两个日期之间的工作日数。我不需要担心假期。不幸的是,我的尝试都是徒劳的。非常感谢

这将包含在 Reporting Service 2008 R2 中的自定义代码中。

【问题讨论】:

标签: vb.net ssrs-2008


【解决方案1】:

试试这个。我修改了我一直在使用的现有功能。这将在 SSRS 2008 中工作。请注意,您也可以用 C# 编写代码,如果您对此更满意,并且在部署它之后,只需从报告中引用程序集即可。1

public Shared Function Weekdays(ByRef startDate As Date,  ByRef endDate As Date   ) As integer
    dim numWeekdays as Integer
    dim totalDays as Integer
    dim WeekendDays as Integer
    numWeekdays = 0
    WeekendDays = 0

    totalDays = DateDiff(DateInterval.Day, startDate , endDate ) + 1

    for i as integer = 1 to totalDays

        if DatePart(dateinterval.weekday,startDate) = 1 then
            WeekendDays = WeekendDays + 1
        end if
        if DatePart(dateinterval.weekday, startDate) = 7 then
            WeekendDays = WeekendDays + 1
        end if
            startDate = DateAdd("d", 1, startDate)
    next

    numWeekdays  = totalDays - WeekendDays 

    return numWeekdays  
End Function 

【讨论】:

  • 在此函数中需要注意的是,您正在修改 startDate 输入参数,这可能会在调用此函数的代码中导致不良后果。您可以通过声明另一个 DateTime 来解决此问题,如下所示:Dim workingStartDate As New DateTime(startDate.Ticks)。也不需要在第一个 totalDays 分配结束时的 +1。它将结果输出 1。
【解决方案2】:

您无需检查这些日期之间的每一天是否都是工作日。

如果有 n 天,则有 int(n / 7) 完整周,每个周包含 5 个工作日,这就是 5 * int(n / 7) 工作日。

然后您需要检查剩余部分周(0..6 天)的天数。

【讨论】:

  • 其实 MRAB 你错了。考虑这两种情况: 1. 周一到下周五的选定日期(共 12 天,10 个工作日) 2. 周四到下周一的选定日期(共 12 天,8 个工作日)
  • @TheMKBear 1. 1 整周(从周一到周日)加上 5 天,全部 5 个工作日,总共 10 个工作日。 2. 即 1 整周(周四至周三)加上 5 天,其中 3 个工作日,总共 8 个工作日。
【解决方案3】:

'这是我的 vb.net 2013 版本及其作品

Private Sub enddate_ValueChanged(sender As Object, e As EventArgs) Handles enddate.ValueChanged
        Dim countsun As Integer = 0
        Dim countsat As Integer = 0
        Dim nonholiday As Integer = 0
        Dim totalDays = (enddate.Value - startdate.Value).Days
        For i = 0 To totalDays
            Dim Weekday As DayOfWeek = startdate.Value.Date.AddDays(i).DayOfWeek
            If Weekday = DayOfWeek.Saturday Then
                countsat += 1
            End If
            If Weekday = DayOfWeek.Sunday Then
                countsun += 1
            End If
            If Weekday <> DayOfWeek.Saturday AndAlso Weekday <> DayOfWeek.Sunday Then
                nonholiday += 1
            End If
        Next
        lblSumHeadCount.Text = nonholiday & " Day(s)"
    End Sub

'谢谢加布

【讨论】:

    【解决方案4】:

    这可能会帮助其他人寻找这个。这个函数不会每天循环。

        public static double WorkDays(DateTime start, DateTime end)
        {
            var delta = end.AddDays(1) - start;
            var fullWeeks = (int)(delta.TotalDays / 7);
            var workDays = fullWeeks * 5;
    
            var partialWeekDays = delta.TotalDays % 7;
            if (partialWeekDays > 0)
            {
                var startWeekday = start.DayOfWeek;
                var endWeekday = end.DayOfWeek;
    
                if (startWeekday == DayOfWeek.Sunday || startWeekday == DayOfWeek.Saturday)
                    partialWeekDays--;
                if (startWeekday > DayOfWeek.Sunday && startWeekday < DayOfWeek.Saturday &&
                    startWeekday > endWeekday)
                    partialWeekDays--;
                if ((endWeekday == DayOfWeek.Sunday || endWeekday == DayOfWeek.Saturday) && endWeekday != startWeekday)
                    partialWeekDays--;
                if (endWeekday > DayOfWeek.Sunday && endWeekday < DayOfWeek.Saturday &&
                    startWeekday > endWeekday)
                    partialWeekDays--;
            }
    
            return workDays + partialWeekDays;
        }
    

    【讨论】:

      【解决方案5】:

      我有一个表达式可以计算两个日期之间特定星期几的数量。因此,如果您在星期一、星期二...星期五添加金额,您将获得工作日的数量。

      =SUM(int((DatePart("d",Fields!dteEndDateTime.Value) - Weekday(DateAdd("d",1-**[DayofWeek]**,Fields!dteEndDateTime.Value)) - DatePart("d",Fields!dteStartDateTime.Value) + 8)/7))
      

      [DayofWeek] 是代表一天的整数:1 - Sunday; 2 - Monday

      因此,计算dteStartDateTimedteEndDateTime 之间的星期一数量的表达式是:

      =SUM(int((DatePart("d",Fields!dteEndDateTime.Value) - Weekday(DateAdd("d",1-2,Fields!dteEndDateTime.Value)) - DatePart("d",Fields!dteStartDateTime.Value) + 8)/7)) 
      

      【讨论】:

        【解决方案6】:

        我认为这可能会有所帮助

        Public Shared Function WeekEndsBetweenDates(ByVal StartDate As Date, ByVal EndDate As Date) As Integer
            Dim wkday, wkend As Integer
            For i As Integer = 0 To DateDiff(DateInterval.Day, StartDate, EndDate)
        
                If DateAdd(DateInterval.Day, i, StartDate).DayOfWeek = DayOfWeek.Saturday Or DateAdd(DateInterval.Day, i, StartDate).DayOfWeek = DayOfWeek.Sunday Then
                    wkend += 1
                Else
                    wkday += 1
                End If
            Next
            Return wkend
        End Function
        

        在这里,我返回了“wkend”,它是函数中变量的周末部分。或者,您可以将返回值更改为“wkday”,即所选日期之间的工作日数。 我希望这有帮助。不过对我有用

        【讨论】:

          猜你喜欢
          • 2018-08-03
          • 2010-09-20
          • 1970-01-01
          • 2014-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多