DateDiff funtion not showing correct value (1 Viewer)

Ashfaque

Student
Local time
Today, 15:54
Joined
Sep 6, 2004
Messages
894
Hi,

For some reason I need to count days between 2 days and then later on convert it into months and days.

Days function is displaying correct but Month function is a bit difficult. It displays round figure of months.

Example.

my VacSalFrom date is 15/09/2019 and VacSalTo date is 11/05/2020 which counting correct days i.e. total 239 days.

VacSalMonths = Int(DateDiff("M", VacSalFrom, VacSalTo))
VacSalDays = (VacSalDays Mod 30)

so VacSalmonths is appearing 8 which is wrong. It should display 7
VacSalDays is resulting correct as 29

I tried with Fix, Integer, Round function but still same

Can someone help me please?
 

bob fitz

AWF VIP
Local time
Today, 10:24
Joined
May 23, 2011
Messages
4,717
The attached db has many useful date function examples, including one which does what you require.
 

Attachments

  • UsefulDateFunctions.accdb
    1.2 MB · Views: 159

arnelgp

..forever waiting... waiting for jellybean!
Local time
Today, 18:24
Joined
May 7, 2009
Messages
19,175
I made a "modified" version:

you call the function:

Dim s As String, m as integer, d as integer
s = Diff2Dates("m/d", VacSalFrom, VacSalTo)
'take the month
m=Val(Split(s, "/")(0))

'and the days
d=Val(Split(s, "/")(1))

Code:
Public Function Diff2Dates(interval As String, Date1 As Variant, Date2 As Variant, _
                            Optional ShowZero As Boolean = True) As Variant
'Author:    ? Copyright 2001 Pacific Database Pty Limited
'           Graham R Seach MCP MVP gseach@pacificdb.com.au
'           Phone: +61 2 9872 9594  Fax: +61 2 9872 9593
'           This code is freeware. Enjoy...
'           (*) Amendments suggested by Douglas J. Steele MVP
'
'Description:   This function calculates the number of years,
'               months, days, hours, minutes and seconds between
'               two dates, as elapsed time.
'
'Inputs:    Interval:   Intervals to be displayed (a string)
'           Date1:      The lower date (see below)
'           Date2:      The higher date (see below)
'           ShowZero:   Boolean to select showing zero elements
'
'Outputs:   On error: Null
'           On no error: Variant containing the number of years,
'               months, days, hours, minutes & seconds between
'               the two dates, depending on the display interval
'               selected.
'           If Date1 is greater than Date2, the result will
'               be a negative value.
'           The function compensates for the lack of any intervals
'               not listed. For example, if Interval lists "m", but
'               not "y", the function adds the value of the year
'               component to the month component.
'           If ShowZero is True, and an output element is zero, it
'               is displayed. However, if ShowZero is False or
'               omitted, no zero-value elements are displayed.
'               For example, with ShowZero = False, Interval = "ym",
'               elements = 0 & 1 respectively, the output string
'               will be "1 month" - not "0 years 1 month".
'
'Modified by:   ArnelGP
'
'take into account the format that the user wants.
'

On Error GoTo Err_Diff2Dates

   Dim booCalcYears As Boolean
   Dim booCalcMonths As Boolean
   Dim booCalcDays As Boolean
   Dim booCalcHours As Boolean
   Dim booCalcMinutes As Boolean
   Dim booCalcSeconds As Boolean
   Dim booCalcWeeks As Boolean
   Dim booSwapped As Boolean
   Dim dtTemp As Date
   Dim intCounter As Integer
   Dim lngDiffYears As Long
   Dim lngDiffMonths As Long
   Dim lngDiffDays As Long
   Dim lngDiffHours As Long
   Dim lngDiffMinutes As Long
   Dim lngDiffSeconds As Long
   Dim lngDiffWeeks As Long
   Dim varTemp As Variant

   Dim sFormat As String
 
   Const INTERVALS As String = "dmyhnsw"

'Check that Interval contains only valid characters
   interval = LCase$(interval)
   For intCounter = 1 To Len(interval)
      If InStr("/: ", Mid(interval, intCounter, 1)) > 0 Then
        'ignore
      Else
        If InStr(1, INTERVALS, Mid$(interval, intCounter, 1)) = 0 Then
           Exit Function
        End If
     End If
   Next intCounter

'Check that valid dates have been entered
   If IsNull(Date1) Then Exit Function
   If IsNull(Date2) Then Exit Function
   If Not (IsDate(Date1)) Then Exit Function
   If Not (IsDate(Date2)) Then Exit Function

'If necessary, swap the dates, to ensure that
'Date1 is lower than Date2
   If Date1 > Date2 Then
      dtTemp = Date1
      Date1 = Date2
      Date2 = dtTemp
      booSwapped = True
   End If

   Diff3Dates = Null
   varTemp = Null

'What intervals are supplied
   booCalcYears = (InStr(1, interval, "y") > 0)
   booCalcMonths = (InStr(1, interval, "m") > 0)
   booCalcDays = (InStr(1, interval, "d") > 0)
   booCalcHours = (InStr(1, interval, "h") > 0)
   booCalcMinutes = (InStr(1, interval, "n") > 0)
   booCalcSeconds = (InStr(1, interval, "s") > 0)
   booCalcWeeks = (InStr(1, interval, "w") > 0)

'Get the cumulative differences
   If booCalcYears Then
      lngDiffYears = Abs(DateDiff("yyyy", Date1, Date2)) - _
              IIf(Format$(Date1, "mmddhhnnss") <= Format$(Date2, "mmddhhnnss"), 0, 1)
      Date1 = DateAdd("yyyy", lngDiffYears, Date1)
   End If

   If booCalcMonths Then
      lngDiffMonths = Abs(DateDiff("m", Date1, Date2)) - _
              IIf(Format$(Date1, "ddhhnnss") <= Format$(Date2, "ddhhnnss"), 0, 1)
      Date1 = DateAdd("m", lngDiffMonths, Date1)
   End If

   If booCalcWeeks Then
      lngDiffWeeks = Abs(DateDiff("w", Date1, Date2)) - _
              IIf(Format$(Date1, "hhnnss") <= Format$(Date2, "hhnnss"), 0, 1)
      Date1 = DateAdd("ww", lngDiffWeeks, Date1)
   End If

   If booCalcDays Then
      lngDiffDays = Abs(DateDiff("d", Date1, Date2)) - _
              IIf(Format$(Date1, "hhnnss") <= Format$(Date2, "hhnnss"), 0, 1)
      Date1 = DateAdd("d", lngDiffDays, Date1)
   End If

   If booCalcHours Then
      lngDiffHours = Abs(DateDiff("h", Date1, Date2)) - _
              IIf(Format$(Date1, "nnss") <= Format$(Date2, "nnss"), 0, 1)
      Date1 = DateAdd("h", lngDiffHours, Date1)
   End If

   If booCalcMinutes Then
      lngDiffMinutes = Abs(DateDiff("n", Date1, Date2)) - _
              IIf(Format$(Date1, "ss") <= Format$(Date2, "ss"), 0, 1)
      Date1 = DateAdd("n", lngDiffMinutes, Date1)
   End If

   If booCalcSeconds Then
      lngDiffSeconds = Abs(DateDiff("s", Date1, Date2))
      Date1 = DateAdd("s", lngDiffSeconds, Date1)
   End If

    ' the format here
    varTemp = interval
   If booCalcYears And (lngDiffYears > 0 Or ShowZero) Then
      varTemp = Replace(varTemp, "yyyy", "y")
      varTemp = Replace(varTemp, "y", lngDiffYears)
   End If

   If booCalcMonths And (lngDiffMonths > 0 Or ShowZero) Then
      If booCalcMonths Then
         varTemp = Replace(varTemp, "m", lngDiffMonths)
      End If
   End If

   If booCalcWeeks And (lngDiffWeeks > 0 Or ShowZero) Then
      If booCalcWeeks Then
         varTemp = Replace(varTemp, "ww", "w")
         varTemp = Replace(varTemp, "w", lngDiffWeeks)
      End If
   End If

   If booCalcDays And (lngDiffDays > 0 Or ShowZero) Then
      If booCalcDays Then
         varTemp = Replace(varTemp, "dd", "d")
         varTemp = Replace(varTemp, "d", lngDiffDays)
      End If
   End If
   
   If booCalcHours And (lngDiffHours > 0 Or ShowZero) Then
      If booCalcHours Then
         sFormat = String(NumChar(varTemp, "h"), "0")
         varTemp = Replace(varTemp, "hh", "h")
         varTemp = Replace(varTemp, "h", Format(lngDiffHours, sFormat))
      End If
   End If

   If booCalcMinutes And (lngDiffMinutes > 0 Or ShowZero) Then
      If booCalcMinutes Then
         sFormat = String(NumChar(varTemp, "n"), "0")
         varTemp = Replace(varTemp, "nn", "n")
         varTemp = Replace(varTemp, "n", Format(lngDiffMinutes, sFormat))
      End If
   End If

   If booCalcSeconds And (lngDiffSeconds > 0 Or ShowZero) Then
      If booCalcSeconds Then
         sFormat = String(NumChar(varTemp, "s"), "0")
         varTemp = Replace(varTemp, "ss", "s")
         varTemp = Replace(varTemp, "s", Format(lngDiffSeconds, sFormat))
      End If
   End If

   If booSwapped Then
      varTemp = "-" & varTemp
   End If

   Diff2Dates = Trim$(varTemp)

End_Diff2Dates:
   Exit Function

Err_Diff2Dates:
   Resume End_Diff2Dates

End Function
'************** Code End *****************

' arnelgp
Private Function NumChar(ByVal sInput As String, ByVal sChar As String)
    Dim lngLen1 As Long
    Dim lngLen2 As Long
    lngLen1 = Len(sInput)
    sInput = Replace(sInput, sChar, "")
    lngLen2 = Len(sInput)
    NumChar = lngLen1 - lngLen2
End Function
 

Users who are viewing this thread

Top Bottom