2016-02-17 3 views
0

Как отображать различия между годами и месяцами в доступе в 2013 году. Я использую формулу DateDiff, но это не сработало. Кажется, DateDiff может отображать только один из символов (m, yyyy или d). Если DateDiff не может отображать как месяцы, так и годы, существуют ли другие коды для этого?Microsoft Access отображает различия между месяцами и годами

+0

Примеры одного из моих различий во времени: #Jan 2 2007 #, #Jan 1 2016 #. Я хочу использовать запросы Access вместо –

+0

От вашего комментария разница будет '8 год 11 месяц 30 дней' Вы хотите это или что-то другое. – harun24hr

+0

Да, я хочу что-то вроде этого –

ответ

0

Вы не можете сделать это так просто, потому что DateDiff показывает разницу между календарными годами или месяцами, а не TimeSpan , Выше попытка вернуть эту последовательность так:

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 
+0

Итак, если мне нужен дисплей, как то, что вы сделали, мне нужно использовать VBA? –

+0

Да. Скопируйте и вставьте код в новый модуль.Затем вы можете использовать выражение 'DateSpan: YearsMonthsDays ([StartDate], [EndDate])' – Gustav

0

только провел несколько тестов ... Я бы очистить его немного больше, чтобы объяснить множественном, когда не требуется, но это должно дать вам хороший старт:

' Calculate Years and Months Difference 
    Private Sub btnCalculate_Click() 
     Dim intYears As Integer 
     Dim intMonths As Integer 
     intYears = (DateDiff("m", Me.txtDateStart, Me.txtDateEnd)/12) 
     intMonths = (DateDiff("m", Me.txtDateStart, Me.txtDateEnd) Mod 12) 
     Me.lblDifference.Caption = intYears & " Years " & intMonths & " Months" 
    End Sub 

ДОПОЛНЕНИЯ к новому ПОЯСНЕНИЮ: я не проверял, но в запросе, вы должны быть в состоянии сделать это таким же образом: Положите эти выражения в заголовках столбцов

TotalYears:=(DateDiff("m", [dtStartDate], [dtEndDate])/12) 

в другой колонке заголовок:

TotalMonths:=TotalYears:=(DateDiff("m", [dtStartDate], [dtEndDate]) Mod 12) 

Я получил его, чтобы он работал нормально. Вот как я применил его: enter image description here

И тогда вы можете увидеть результаты: enter image description here

+0

Спасибо за ваш ответ. Но, что, используя VBA? Ну, на самом деле я хочу использовать запрос. Но все в порядке. В любом случае, как использовать VBA? Я никогда не пробовал это до –

+0

Посмотрите на мой обновленный ответ, теперь, когда у меня есть более подробные сведения о том, что вы ищете. –

+0

Еще раз спасибо. Но это все еще неправильно в TotalMonths. И для чего именно «: =» используется? Это невозможно сделать в Access –

Смежные вопросы