Vb.net 在visual basic中计算两个日期之间的工作日数

Vb.net 在visual basic中计算两个日期之间的工作日数,vb.net,ssrs-2008,Vb.net,Ssrs 2008,我是SQL专家,但我需要一个函数来计算VB.NET中两个日期之间的工作日数。我不需要担心假期。不幸的是,我的尝试是徒劳的。非常感谢 这将进入Reporting Service 2008 R2中的自定义代码。试试这个。我修改了我一直在使用的现有函数。这将在SSRS 2008中起作用。请注意,如果您对C#更熟悉,您也可以用C#编写代码,并且在部署它之后,只需从报告中引用程序集即可 您不需要检查这些日期之间的每一天是否都是工作日 如果有n天,那么就有int(n/7)完整的周,每个周包含5个工作日,因此

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


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

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


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

如果有
n
天,那么就有
int(n/7)
完整的周,每个周包含5个工作日,因此这就是
5*int(n/7)
工作日


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

这可能有助于其他人查找此信息。这个函数不会每天循环

    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;
    }
公共静态双工作日(日期时间开始,日期时间结束)
{
var delta=结束。添加天数(1)-开始;
var fullWeeks=(整数)(delta.TotalDays/7);
var工作日=整周*5;
var partialWeekDays=delta.TotalDays%7;
如果(部分工作日>0)
{
var startWeekday=start.DayOfWeek;
var endWeekday=end.DayOfWeek;
如果(startWeekday==DayOfWeek.Sunday | | startWeekday==DayOfWeek.周六)
部分工作日--;
如果(startWeekday>DayOfWeek.Sunday&&startWeekdayendWeekday)
部分工作日--;
如果((endWeekday==DayOfWeek.Sunday | | endWeekday==DayOfWeek.Saturday)&&endWeekday!=startWeekday)
部分工作日--;
如果(endWeekday>DayOfWeek.Sunday&&endWeekdayendWeekday)
部分工作日--;
}
返回工作日+部分工作日;
}

我有一个表达式,可以计算两个日期之间的一周中特定日期的数量。所以,如果你在周一、周二增加金额。。。星期五你将得到一周的天数

=SUM(int((DatePart("d",Fields!dteEndDateTime.Value) - Weekday(DateAdd("d",1-**[DayofWeek]**,Fields!dteEndDateTime.Value)) - DatePart("d",Fields!dteStartDateTime.Value) + 8)/7))
[DayofWeek]是一个整数,表示一天:
1-周日;2-星期一

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

=SUM(int((DatePart("d",Fields!dteEndDateTime.Value) - Weekday(DateAdd("d",1-2,Fields!dteEndDateTime.Value)) - DatePart("d",Fields!dteStartDateTime.Value) + 8)/7)) 
我想这可能会有帮助

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”,即所选日期之间的工作日数。
我希望这有帮助。这是我的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
Private Sub enddate\u ValueChanged(发送方作为对象,e作为事件参数)处理enddate.ValueChanged
Dim countsun为整数=0
Dim countsat为整数=0
Dim非假日为整数=0
Dim totalDays=(enddate.Value-startdate.Value).Days
对于i=0到总计天
Dim Weekday As DayOfWeek=startdate.Value.Date.AddDays(i).DayOfWeek
如果Weekday=星期六,则
countsat+=1
如果结束
如果Weekday=DayOfWeek.Sunday,则
countsun+=1
如果结束
如果是星期一、星期六和星期一、星期日,那么
非假日+=1
如果结束
下一个
lblSumHeadCount.Text=非假日和“天”
端接头

“谢谢Gabe

爱C回答VB问题。C#中有一个类似的问题:事实上,你错了。考虑这两种情况:1。从周一到下周五的选定日期(总共12天,10个工作日)2。从周四到下周一的选定日期(总共12天,8个工作日)@TheMKBear 1。这是一个完整的星期(从周一到周日)加上5天,全部5个工作日,总共10个工作日。2.这是一个完整的星期(从星期四到星期三)加上5天,其中3个工作日,总共8个工作日。在这个函数中需要注意的是,您正在修改startDate输入参数,这可能会在调用此函数的代码中造成不必要的后果。您可以通过声明另一个DateTime来解决这个问题,例如:Dim workingStartDate作为新的DateTime(startDate.Ticks)。此外,不需要在第一个totalDays分配结束时输入+1。它将结果以1表示。
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