Классический ASP число рабочих дней между датами - PullRequest
0 голосов
/ 22 октября 2018

Есть ли какой-нибудь способ в классическом ASP VBScript, чтобы узнать количество дней недели между двумя датами?Очевидно, что у нас есть функция DateDiff(), но она будет сокращать общее количество дней, но я хотел бы пропустить выходные.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

VBScript не включает запрошенную операцию, но, поскольку DateDiff с интервалом ww возвращает количество воскресений между двумя датами, гарантируя, что начальная и конечная даты выходят из выходных, мы можем напрямую рассчитать количество рабочихдни:

Option Explicit

Function WorkingDaysBetween( ByVal d1, ByVal d2 )
Dim d
    ' Adjust date order to simplify calcs and always return 0 or positive number
    If d1 > d2 Then 
        d = d1 : d1 = d2 : d2 = d
    End If 

    ' Move start date forward if it is a weekend
    d = WeekDay( d1, vbMonday )
    If d > 5 Then d1 = DateAdd( "d", 3-(d\6 + d\7), d1)

    ' Move end date backward if it is a weekend
    d = WeekDay( d2, vbMonday )
    If d > 5 Then d2 = DateAdd( "d", -1*(d\6 + d\7), d2)

    ' Calculate 
    '   DateDiff("d") = Number of days between dates
    '   +1 to include start day
    '   -2 * DateDiff("ww") to exclude weekends between dates
    WorkingDaysBetween = 1 + DateDiff("d", d1, d2, vbMonday) - 2*DateDiff("ww", d1, d2, vbMonday)

    ' If the result is negative, there are no working days between both dates
    If WorkingDaysBetween < 0 Then WorkingDaysBetween = 0
End Function
0 голосов
/ 22 октября 2018

Вы правы, DateDiff() не покрывает это, но его можно использовать вместе с WeekDay() для определения, если Day выпадает на выходные.

При использовании DateDiff() чтобы получить количество дней, мы можем затем использовать цикл For для перехода по дням, используя DateAdd(), чтобы увеличить день по мере того, как мы идем, и проверить, является ли увеличенное значение даты конкретным WeekDay().Затем мы можем на основании этого результата решить, следует ли увеличить счетчик, в котором хранится полученное нами число дней недели.

Ниже приведен пример того, как вы это сделаете, основная логика была заключена в функцию, которую выможет быть включен в файл сценария #include для использования на нескольких страницах.

<%
Function DateDiffWeekDays(d1, d2)
    Dim dy: dy = 0
    Dim dys: dys = DateDiff("d", d1, d2)
    Dim isWeekDay: isWeekDay = False
    Dim wkd
    Dim wd: wd = 0

    For dy = 0 To dys
        wkd = Weekday(DateAdd("d", dy, d1))
        isWeekDay = Not (wkd = vbSunday Or wkd = vbSaturday)
        If isWeekDay Then wd = wd + 1
    Next
    DateDiffWeekDays = wd
End Function

'Example of how to call the function and output to the page
Call Response.Write(DateDiffWeekDays(Date(), CDate("12 Nov 2018")))
%>

Вывод:

16

Это только краткий пример и не охватывает все возможные варианты использованияИдея в том, что это дает вам отправную точку, с которой вы можете работать и совершенствоваться.

...