2012-06-24 2 views
2

참조 DateDiff가 잘못 계산 :정확한 날짜 차이는

DateDiff("m", "30/06/2011", "24/06/2012") will return 12 

그러나 실제 차이는 11 월 25 일

때문에 내가 11을 반환해야

어쩌면 누군가는이 질문에

에 대한 구체적인 해결책을 가지고 있습니다

나를 위해 이상적인 것 : 11 개월 25

답변

3

위의 맞춤 기능보다 더 깨끗한 해결책이 있습니다. 주로 내장 된 DateDiff 함수를 사용하지만 반올림하면 답변을 조정합니다. 첫 번째 날짜가 두 번째 날짜보다 늦 더라도 필자의 함수는 차이점을 제공하고 선택적으로 그렇게 말하는 텍스트를 추가 할 수도 있습니다.

Function YearsMonthsDays(Date1 As Date, _ 
        Date2 As Date, _ 
        Optional ShowAll As Boolean = False, _ 
        Optional Grammar As Boolean = True, _ 
        Optional MinusText As String = "Minus " _ 
        ) As String 
Dim dTempDate As Date 
Dim iYears As Integer 
Dim iMonths As Integer 
Dim iDays As Integer 
Dim sYears As String 
Dim sMonths As String 
Dim sDays As String 
Dim sGrammar(-1 To 0) As String 
Dim sMinusText As String 

If Grammar = True Then 
    sGrammar(0) = "s" 
End If 


If Date1 > Date2 Then 
    dTempDate = Date1 
    Date1 = Date2 
    Date2 = dTempDate 
    sMinusText = MinusText 
End If 

iYears = DateDiff("yyyy", Date1, Date2) 
Date1 = DateAdd("yyyy", iYears, Date1) 
If Date1 > Date2 Then 
    iYears = iYears - 1 
    Date1 = DateAdd("yyyy", -1, Date1) 
End If 

iMonths = DateDiff("M", Date1, Date2) 
Date1 = DateAdd("M", iMonths, Date1) 
If Date1 > Date2 Then 
    iMonths = iMonths - 1 
    Date1 = DateAdd("m", -1, Date1) 
End If 

iDays = DateDiff("d", Date1, Date2) 

If ShowAll Or iYears > 0 Then 
    sYears = iYears & " year" & sGrammar((iYears = 1)) & ", " 
End If 
If ShowAll Or iYears > 0 Or iMonths > 0 Then 
    sMonths = iMonths & " month" & sGrammar((iMonths = 1)) & ", " 
End If 
sDays = iDays & " day" & sGrammar((iDays = 1)) 

YearsMonthsDays = sMinusText & sYears & sMonths & sDays 
End Function 
0

당신은 순수한 DateDiff으로 그것을 얻지 못할 것입니다. 당신은 또한 (결국 하나의 F)와 DateDif 기능이 좀 걸릴 수 있습니다

0 years, 1 months, 1 days 

:이 custom made function를 사용하는 경우, 당신은 당신이 원하는 방식으로 원하는 결과를 얻을. 종료일의 시작일보다 적은 일수가있는 경우 DateDif()가 예상치 못한 결과 (예 : 음수 일 수 있음)를 제공한다는 사실을 기억하십시오.