Comparing five dates in VBScript

2019-09-07 06:02发布

I've written the following code to find the oldest of five dates. It works as expected, but I'm curious if there's a more elegant way to compare five dates. Does anyone have any ideas?

Dim sTemp
sTemp = ""

If IsDate(dtOne) Then
    If IsDate(dtTwo) Then
        If CDate(dtOne) < CDate(dtTwo) Then
            sTemp = dtOne
        Else
            sTemp = dtTwo
        End If
    Else
        sTemp = dtOne
    End If
ElseIf IsDate(dtTwo) Then
    sTemp = dtTwo
End If

If IsDate(dtThree) Then
    If IsDate(sTemp) Then
        If CDate(dtThree) < CDate(sTemp) Then
            sTemp = dtThree
        End If
    Else
        sTemp = dtThree
    End If
End If

If IsDate(dtFour) Then
    If IsDate(sTemp) Then
        If CDate(dtFour) < CDate(sTemp) Then
            sTemp = dtFour
        End If
    Else
        sTemp = dtFour
    End If
End If

If IsDate(dtFive) Then
    If IsDate(sTemp) Then
        If CDate(dtFive) < CDate(sTemp) Then
            sTemp = dtFive
        End If
    Else
        sTemp = dtFive
    End If
End If

标签: vbscript
3条回答
爱情/是我丢掉的垃圾
2楼-- · 2019-09-07 06:24

How about something like this, it does each comparison and if neither passed variables are date it restores sTemp to "":

Dim sTemp
sTemp = ""
sTemp = OldestDate(dtOne, dtTwo)
sTemp = OldestDate(dtThree, sTemp)
sTemp = OldestDate(dtfour, sTemp)
sTemp = OldestDate(dtfive, sTemp)

Function OldestDate(dtOne, dtTwo)
    If IsDate(dtOne) Then
        If IsDate(dtTwo) Then
            If CDate(dtOne) < CDate(dtTwo) Then
                OldestDate = dtOne
            Else
                OldestDate = dtTwo
            End If
        Else
            OldestDate = dtOne
        End If
    ElseIf IsDate(dtTwo) Then
        OldestDate = dtTwo
    Else
         OldestDate = ""
    End If
End Function
查看更多
三岁会撩人
3楼-- · 2019-09-07 06:24

I would use something like this:

sTemp = GetOldestOf(sTemp, dtOne)   ' this instruction makes "dtOne" the current
                                    ' current oldest date, b/c "sTemp" is auto-
                                    ' initialized as Empty
sTemp = GetOldestOf(sTemp, dtTwo)
sTemp = GetOldestOf(sTemp, dtThree)
sTemp = GetOldestOf(sTemp, dtFour)
sTemp = GetOldestOf(sTemp, dtFive)

If isEmpty(sTemp) Then
  WScript.Echo "No valid date found!"
Else
  WScript.Echo "Oldest date is: " & sTemp
End If

' pre-condition: d1 is either Empty or the current oldest date
Function GetOldestOf(ByVal d1, ByVal d2)
  GetOldestOf = d1          ' make d1 the default return value
  If IsDate(d2) Then        ' d2 is a valid date
    d2 = CDate(d2)
    If IsEmpty(d1) Then     ' if d1 is empty, d2 is automatically oldest
      GetOldestOf = d2
    ElseIf d1 > d2 Then     ' otherwise check if d2 is older
      GetOldestOf = d2
    End If
  End If
End Function

GetOldestOf() returns the second argument (converted to a date) if the argument is a valid date and the first argument is either Empty or newer than the second argument. Otherwise the function returns the (unmodified) first argument, which by definition is either Empty or the current oldest date.

查看更多
Emotional °昔
4楼-- · 2019-09-07 06:25

You asked for an elegant approach, then use an ArrayList, fill it and sort it. Underneath the proof of concept code, it does not handle exceptions like none of the dates are valid:

' Create a new arraylist
Set arrayList = createobject("System.Collections.ArrayList")

' Loop through all dates
For each d in array("23-5-2007", "28-6-2010", "16-9-2001", "32-12-2000")
     ' See if the date is valid. If true, convert it to a date and add it to the list
    If isDate(d) Then arrayList.Add cDate(d)
Next

' Sort the list from oldest to newest date
arrayList.Sort

' Get the first item, it will be the oldest date (16-9-2001)
OldestDate = arrayList.Item(0)
查看更多
登录 后发表回答