Подсчитайте количество дней недели между двумя датами в Visual Basic - PullRequest
1 голос
/ 15 июля 2011

Я парень по SQL, но мне нужна функция для вычисления количества дней недели между двумя датами в VB.NET. Мне не нужно беспокоиться о праздниках. Мои попытки, к сожалению, были тщетными. Высоко ценится

Это будет использоваться в пользовательском коде в Reporting Service 2008 R2.

Ответы [ 6 ]

7 голосов
/ 15 июля 2011

Попробуй это.Я изменил существующую функцию, которую я использовал.Это будет работать в 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 
5 голосов
/ 15 июля 2011

Вам не нужно проверять, является ли каждый день между этими датами рабочим днем.

Если есть n дни, то есть int(n / 7) полных недели, каждая из которых содержит 5 рабочих дней,это 5 * int(n / 7) будние дни.

Затем необходимо проверить дни оставшейся неполной недели (0..6 дня).

1 голос
/ 22 марта 2017

'Это моя версия 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

Спасибо, Гейб

0 голосов
/ 18 февраля 2015

Я думаю, что это может помочь

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 голосов
/ 17 апреля 2012

У меня есть выражение, которое вычислит количество определенного дня недели между двумя датами. Таким образом, если вы добавите сумму по понедельникам, вторникам ... по пятницам вы получите количество дней недели.

=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

Таким образом, выражение, которое будет вычислять количество понедельников между dteStartDateTime и dteEndDateTime, равно:

=SUM(int((DatePart("d",Fields!dteEndDateTime.Value) - Weekday(DateAdd("d",1-2,Fields!dteEndDateTime.Value)) - DatePart("d",Fields!dteStartDateTime.Value) + 8)/7)) 
0 голосов
/ 13 марта 2012

Это может помочь кому-то еще, ищущему это. Эта функция не зацикливается день за днем.

    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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...