アクセス2013で年月差を表示する方法DateDiff式を使っていたのですがうまくいきませんでした。DateDiff は記号 (m、yyyy、または d) の 1 つしか表示できないようです。DateDiff が月と年の両方を表示できない場合、それを行うために利用できる他のコードはありますか?
質問する
1011 次
2 に答える
0
DateDiffはタイムスパンではなく暦年または月の違いを示すため、これを簡単に行うことはできません。上記の試みは、このシーケンスを次のように返します。
d1: 2016-02 d2: 2016-08 Y: 0 M: 6
d1: 2016-02 d2: 2016-09 Y: 0 M: 7
d1: 2016-02 d2: 2016-10 Y: 0 M: 8
d1: 2016-02 d2: 2016-11 Y: 0 M: 9
d1: 2016-02 d2: 2016-12 Y: 0 M: 10
d1: 2016-02 d2: 2017-01 Y: 1 M: 11
d1: 2016-02 d2: 2017-02 Y: 1 M: 0
d1: 2016-02 d2: 2017-03 Y: 1 M: 1
d1: 2016-02 d2: 2017-04 Y: 1 M: 2
d1: 2016-02 d2: 2017-05 Y: 1 M: 3
d1: 2016-02 d2: 2017-06 Y: 1 M: 4
真のタイムスパンについては、次のような関数を使用する必要があります。
Public Function YearsMonthsDays( _
ByVal datDate1 As Date, _
ByVal datDate2 As Date, _
Optional ByRef lngYears As Long, _
Optional ByRef lngMonths As Long, _
Optional ByRef lngDays As Long) _
As String
' Returns the difference in years, months, and days between datDate1 and datDate2.
'
' Calculates correctly for:
' negative differences
' leap years
' dates of 29. February
' date/time values with embedded time values
' negative date/time values (prior to 1899-12-29)
'
' Gustav Brock, Cactus Data ApS.
' 2010-03-30.
' Count of months in a calendar year.
Const cintMonths As Integer = 12
Dim datDateMonth As Date
Dim intDays As Integer
' No special error handling.
On Error Resume Next
lngMonths = Months(datDate1, datDate2)
datDateMonth = DateAdd("m", lngMonths, datDate1)
lngDays = DateDiff("d", datDateMonth, datDate2)
intDays = Sgn(lngDays)
If intDays <> 0 Then
If intDays <> Sgn(DateDiff("d", datDate1, datDate2)) Then
lngDays = 0
End If
End If
lngYears = lngMonths \ cintMonths
lngMonths = lngMonths Mod cintMonths
YearsMonthsDays = CStr(lngYears) & " year(s), " & CStr(lngMonths) & " month(s), " & CStr(lngDays) & " day(s)"
End Function
このヘルパー関数を使用します:
Public Function Months( _
ByVal datDate1 As Date, _
ByVal datDate2 As Date, _
Optional ByVal booLinear As Boolean) _
As Integer
' Returns the difference in full months between datDate1 and datDate2.
'
' Calculates correctly for:
' negative differences
' leap years
' dates of 29. February
' date/time values with embedded time values
' negative date/time values (prior to 1899-12-29)
'
' Optionally returns negative counts rounded down to provide a
' linear sequence of month counts.
' For a given datDate1, if datDate2 is decreased stepwise one month from
' returning a positive count to returning a negative count, one or two
' occurrences of count zero will be returned.
' If booLinear is False, the sequence will be:
' 3, 2, 1, 0, 0, -1, -2
' If booLinear is True, the sequence will be:
' 3, 2, 1, 0, -1, -2, -3
'
' If booLinear is False, reversing datDate1 and datDate2 will return
' results of same absolute Value, only the sign will change.
' This behaviour mimics that of Fix().
' If booLinear is True, reversing datDate1 and datDate2 will return
' results where the negative count is offset by -1.
' This behaviour mimics that of Int().
' DateAdd() is used for check for month end of February as it correctly
' returns Feb. 28. when adding a count of months to dates of Feb. 29.
' when the resulting year is a common year.
'
' 2010-03-30. Cactus Data ApS, CPH.
Dim intDiff As Integer
Dim intSign As Integer
Dim intMonths As Integer
' Find difference in calendar months.
intMonths = DateDiff("m", datDate1, datDate2)
' For positive resp. negative intervals, check if the second date
' falls before, on, or after the crossing date for a 1 month period
' while at the same time correcting for February 29. of leap years.
If DateDiff("d", datDate1, datDate2) > 0 Then
intSign = Sgn(DateDiff("d", DateAdd("m", intMonths, datDate1), datDate2))
intDiff = Abs(intSign < 0)
Else
intSign = Sgn(DateDiff("d", DateAdd("m", -intMonths, datDate2), datDate1))
If intSign <> 0 Then
' Offset negative count of months to continuous sequence if requested.
intDiff = Abs(booLinear)
End If
intDiff = intDiff - Abs(intSign < 0)
End If
' Return count of months as count of full 1 month periods.
Months = intMonths - intDiff
End Function
于 2016-02-17T10:29:39.183 に答える