2011-07-15 172 views
1

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

这将进入Reporting Service 2008 R2中的自定义代码。

+0

http://stackoverflow.com/questions/1092589/is-there- a-net-method-equivalent-to-networkdays-in-excel –

+0

爱C答案的VB问题。 – dbasnett

+0

这里有一个类似的问题在C#中:http://stackoverflow.com/questions/165887/net-date-compare-count-the-amount-of-working-days-since-a-date –

回答

7

试试这个。我修改了我一直在使用的现有函数。这将在SSRS 2008中起作用。请注意,如果您更熟悉C#,还可以使用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 
+0

东西要知道在此函数您正在修改startDate输入参数,这可能会导致调用此函数的代码中产生不必要的结果。你可以通过声明另一个DateTime来解决这个问题,如下所示:Dim workingStartDate As New DateTime(startDate.Ticks)。第一个totalDays分配结束时的+1也是不需要的。它把结果排除1. – kenjara

5

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

如果有n天,那么有int(n/7)整周,每个包含5个工作日,所以这是平日的5 * int(n/7)

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

+0

其实MRAB你错了。考虑这两种情况:1。从周一至下周五的所选日期(共12天,10个工作日) 2.从周四至下个下周一的选定日期(共12天,8个工作日) – 2011-12-06 12:08:36

+0

@TheMKBear 1.这是整整一周(周一至周日)加5天,全部5个工作日,共计10个工作日。 2.这是整整一周(从周四到周三)加上5天,其中3个工作日,共计8个工作日。 – MRAB

0

这可能会帮助别人寻找这个。此功能不会每天循环。

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; 
    } 
0

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

=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)) 
0

我认为这可能帮助

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”,即所选日期之间的周日数。 我希望这可以帮助。这对我的作品虽然

0

'这是我的版本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 

' 感谢加布

相关问题