2011-07-15 217 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 

' 感謝加布

相關問題