Option Compare Database 'Use database order for string comparisons
' Functions to demonstrate date calculations
' Written and developed by Thomas M. Brittell
' Copyright 1998; All rights reserved.
Function tb1stDateQ(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the 1st date of current Quarter
'
Dim intQtr As Integer
Dim intMonth As Integer
Dim intYear As Integer
intYear = Year(dtmDate)
intQtr = Int((Month(dtmDate) - 1) / 3)
intMonth = (intQtr * 3) + 1
tb1stDateQ = DateSerial(intYear, intMonth, 1)
End Function
Function ConvertGregorian(dtmJulianDate As Long)
'
'Warning dtmJulianDate must be a valid date
'
'Return the 1st date of current Quarter
'
ConvertGregorian = DateSerial(1900 + Int(dtmJulianDate / 1000), 1, dtmJulianDate Mod 1000)
End Function
Function Convert2Julian(dtmDate As Date)
'
'Warning dtmDate must be a valid date
'
'Return the Julian day number of the date provided
'
Dim wrkDate As Date
Dim inDate As Date
Dim difDate As Date
inDate = Format(dtmDate, "mm / dd /yyyy")
wrkDate = DateSerial(Year(inDate) - 1, 12, 31)
Convert2Julian = Format(inDate - wrkDate, "000")
End Function
Function tb1stDateW(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the Weekday of specified date
'
Dim intDayCnt As Integer
intDayCnt = WeekDay(dtmDate, 1) - 1
tb1stDateW = DateAdd("d", -intDayCnt, dtmDate)
End Function
Function tb1stDayM(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the First day of provided month
'
Dim wrkDate As Variant
Dim intMonth As Integer
Dim intYear As Integer
Dim intDayCnt As Integer
intMonth = Month(dtmDate)
intYear = Year(dtmDate)
wrkDate = DateSerial(intYear, intMonth, 1)
intDayCnt = WeekDay(wrkDate)
tb1stDayM = tbStrDay(intDayCnt)
End Function
Function tb1stMonday(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the First Monday of provided month
'
Dim wrkDate As Variant
Dim intMonth As Integer
Dim intYear As Integer
Dim intDay As Integer
Dim intDayCnt As Integer
Dim intDiff As Integer
intMonth = Month(dtmDate)
intYear = Year(dtmDate)
'get first date in month
wrkDate = DateSerial(intYear, intMonth, 1)
'get the day of week first day is on
intDayCnt = WeekDay(wrkDate, 1)
'compute number of days to add to next monday
If intDayCnt <> 2 Then
If intDayCnt = 1 Then
intDiff = 1
Else
intDiff = (7 - intDayCnt + 2)
End If
Else
intDiff = 0
End If
wrkDate = DateAdd("d", intDiff, wrkDate)
tb1stMonday = wrkDate
End Function
Function tb1stDayY(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the First day of the year of provided date
'
Dim wrkDate As Variant
Dim intYear As Integer
Dim intDayCnt As Integer
intYear = Year(dtmDate)
wrkDate = DateSerial(intYear, 1, 1)
intDayCnt = WeekDay(wrkDate)
tb1stDayY = tbStrDay(intDayCnt)
End Function
Function tb1stWrkDateM(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the 1st work day of the provided Month
'
Dim wrkDate As Variant
Dim intYear As Integer
Dim intMonth As Integer
Dim intDayCnt As Integer
intYear = Year(dtmDate)
intMonth = Month(dtmDate)
wrkDate = DateSerial(intYear, intMonth, 1)
intDayCnt = WeekDay(wrkDate, 1)
If intDayCnt = 1 Then
'If Sunday Add 1 to work date
wrkDate = DateAdd("d", 1, wrkDate)
ElseIf intDayCnt = 7 Then
'If Saturday add 2 to work date
wrkDate = DateAdd("d", 2, wrkDate)
End If
tb1stWrkDateM = wrkDate
End Function
Function tb1stWrkDateW(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return a date of the 1st Monday of provided week
'
Dim wrkDate As Variant
Dim intDayCnt As Integer
intDayCnt = WeekDay(dtmDate, 1)
If intDayCnt = 1 Then
wrkDate = DateAdd("d", 1, dtmDate)
ElseIf intDayCnt > 2 Then
intDayCnt = intDayCnt - 2
wrkDate = DateAdd("d", -intDayCnt, dtmDate)
Else
wrkDate = dtmDate
End If
tb1stWrkDateW = wrkDate
End Function
Function tbDayCountNoHW(varTable, varCol, dtmStartDate, dtmEndDate, varSelectCol, varSelectCd) As Integer
'
'Warning dtmStartDate and dtmEndDate must be a valid dates
'
'Calculate the difference of the provided dates with no Holidays or weekends included
'
'varTable - Holiday table to use for calculation of count
'varCol - Date column name
'dtmStartDate - starting date inclusive for count
'dtmEndDate - ending date inclusive for count
'varSelectCol - Column to check if sub set of holidays are required.
' such as counting only paid holidays
'varSelectCd - Code to look for in varSelectCol for sub set of holiday
'
Dim strStartDt As Variant
Dim strEndDt As Variant
Dim intDayCnt As Integer
Dim intHolCnt As Integer
Dim intSatSunCnt As Integer
Dim intYear As Integer
Dim strHoldayTableNm As String
strStartDt = Forms![frmTestDateFunctions].StartDt
strEndDt = Forms![frmTestDateFunctions].EndDt
'Get the total day count
intDayCnt = tbDayDiff(strStartDt, strEndDt)
'Get the Saturday & Sunday Count
intSatSunCnt = tbSatSunCount(strStartDt, strEndDt)
'Get the Holiday Count
intYear = Year(strStartDt)
strHoldayTableNm = LTrim(Str(intYear) & "HolidayRef")
intHolCnt = tbHolidayCount(strHoldayTableNm, "HolidayDate", strStartDt, strEndDt, varSelectCol, varSelectCd)
tbDayCountNoHW = intDayCnt - intSatSunCnt - intHolCnt
Exit_tbDayCountNoHW:
Set rstHoliday = Nothing
Set dbs = Nothing
Exit Function
Err_tbDayCountNoHW:
MsgBox "Error #:" & Err & "; " & Error(Err)
GoTo Exit_tbDayCountNoHW
End Function
Function tbDayDiff(dtmStartDate, dtmEndDate)
'
'Warning dtmStartDate and dtmEndDate must be a valid dates
'
'Calculate the difference between the provided dates
'
tbDayDiff = DateDiff("d", dtmStartDate, dtmEndDate)
End Function
Function tbDayOfW(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the Day of provided week
'
Dim intDayCnt As Integer
intDayCnt = WeekDay(dtmDate)
tbDayOfW = tbStrDay(intDayCnt)
End Function
Function tbDaysInMonth(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the Number of days in provided month
'
Dim wrkDate1 As Variant
Dim wrkDate2 As Variant
'Get first day of month to calculate
wrkDate1 = DateSerial(Year(dtmDate), Month(dtmDate), 1)
'Get first day of next month
wrkDate2 = DateAdd("m", 1, wrkDate1)
tbDaysInMonth = DateDiff("d", wrkDate1, wrkDate2)
End Function
Function tbHolidayCount(varTable, varCol, dtmStartDate, dtmEndDate, varSelectCol, varSelectCd) As Integer
'
'Warning dtmDate must be a valid date
'
'Return number of holidays between dates provided
'
'varTable - Holiday to use for calculation of count
'varCol - Date column name
'dtmStartDate - starting date inclusive for count
'dtmEndDate - ending date inclusive for count
'varSelectCol - Column to check if sub set of holidays are required.
' such as counting only paid holidays
'varSelectCd - Code to look for in varSelectCol for sub set of holiday
Dim dbs As Database
Dim rstHoliday As Recordset
Dim strSQL As String
Dim strOldFilter As String
Dim RecCnt As Integer
On Error GoTo Err_tbHolidayCount
Set dbs = DBEngine.Workspaces(0).Databases(0)
strSQL = "SELECT Count([" & varTable & "].[" & varCol & "]) AS HolCnt"
strSQL = strSQL & " FROM " & varTable
strSQL = strSQL & " WHERE (((([" & varTable & "].[" & varCol & "]"
strSQL = strSQL & ")) BETWEEN #" & dtmStartDate & "# AND #" & dtmEndDate & "# ))"
If varSelectCol <> "" Then
strSQL = strSQL & " AND [" & varTable & "].[" & varSelectCol
strSQL = strSQL & "]=" & "'" & varSelectCd & "'"
End If
Set rstHoliday = dbs.OpenRecordset(strSQL)
RecCnt = rstHoliday.HolCnt
rstHoliday.Close
Exit_tbHolidayCount:
tbHolidayCount = RecCnt
Exit Function
Err_tbHolidayCount:
MsgBox "Error #:" & Err & "; " & Error(Err)
Resume Exit_tbHolidayCount
End Function
Function tbIsLeapYr(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Test if the date's year a leap year
'
Dim varYear As Variant
varYear = Year(dtmDate)
tbIsLeapYr = (Day(DateSerial(varYear, 2, 28) + 1) = 29)
End Function
Function tbLastDateM(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the Last date of provided month
'
tbLastDateM = DateSerial(Year(dtmDate), Month(dtmDate) + 1, 0)
End Function
Function tbLastDateQ(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the last date of current Quarter
'
Dim wrkDate As Variant
Dim intQtr As Integer
Dim intMonth As Integer
Dim intYear As Integer
intYear = Year(dtmDate)
intQtr = Int((Month(dtmDate) - 1) / 3)
intMonth = (intQtr * 3) + 4
'get 1st day of next quarter
wrkDate = DateSerial(intYear, intMonth, 1)
tbLastDateQ = DateAdd("d", -1, wrkDate)
End Function
Function tbLastDateW(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the Last date of provided week
'
Dim intDayCnt As Integer
intDayCnt = 7 - WeekDay(dtmDate, 1)
tbLastDateW = DateAdd("d", intDayCnt, dtmDate)
End Function
Function tbLastDateY(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the Last date of provided year
'
tbLastDateY = DateSerial(Year(dtmDate), 12, 31)
End Function
Function tbLastDayM(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the Last day of provided Month
'
Dim wrkDate As Variant
Dim intDayCnt As Integer
wrkDate = DateSerial(Year(dtmDate), Month(dtmDate) + 1, 0)
intDayCnt = WeekDay(wrkDate)
tbLastDayM = tbStrDay(intDayCnt)
End Function
Function tbLastDayQ(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the Last day of the Quarter that the current date is in
'
Dim wrkDate As Variant
Dim intDayCnt As Integer
wrkDate = tbLastDateQ(dtmDate)
intDayCnt = WeekDay(wrkDate)
tbLastDayQ = tbStrDay(intDayCnt)
End Function
Function tbLastDayY(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the Last day of provided year
'
Dim wrkDate As Variant
Dim intDayCnt As Integer
Dim strWeekDay As String
wrkDate = tbLastDateY(dtmDate)
intDayCnt = WeekDay(wrkDate)
tbLastDayY = tbStrDay(intDayCnt)
End Function
Function tbLastWrkDateM(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the last work day of provided Month
'
Dim wrkDate As Variant
Dim intDayCnt As Integer
wrkDate = tbLastDateM(dtmDate)
intDayCnt = WeekDay(wrkDate, 1)
If intDayCnt = 1 Then
'If Sunday -2 from work date to back up to Friday
wrkDate = DateAdd("d", -2, wrkDate)
ElseIf intDayCnt = 7 Then
'If Saturday -1 from work date to back up to Friday
wrkDate = DateAdd("d", -1, wrkDate)
End If
tbLastWrkDateM = wrkDate
End Function
Function tbLastWrkDateW(dtmDate)
'
'Warning dtmDate must be a valid date
'
'Return the Last Work day of provided week
'
Dim intDay As Integer
intDay = 6 - WeekDay(dtmDate, 1)
tbLastWrkDateW = DateAdd("d", intDay, dtmDate)
End Function
Function tbSatSunCount(dtmStartDate, dtmEndDate)
'
'Warning dtmDate must be a valid date
'
'Calculate the number of Saturdays and Sundays between the provided dates
'
Dim SatDate As Date
Dim SunDate As Date
Dim wrkDate As Date
Dim stopDate As Date
Dim intDayCnt As Integer
Dim intDiff As Integer
Dim intSatCnt As Integer
Dim intSunCnt As Integer
intSatCnt = 0
intSunCnt = 0
'compute number of days to add to get to first Saturday
'get the day of week start date is on
intDayCnt = WeekDay(dtmStartDate, 1)
If intDayCnt < 7 Then
intDiff = (7 - intDayCnt)
Else
intDiff = 0
End If
'Set date for first Saturday on or after start date
SatDate = DateAdd("d", intDiff, dtmStartDate)
stopDate = SatDate
Do While stopDate < dtmEndDate
intSatCnt = intSatCnt + 1
stopDate = DateAdd("d", 7, stopDate)
Loop
'compute number of days to add to get to first Sunday
'get the day of week first date is on
intDayCnt = WeekDay(dtmStartDate, 1)
If intDayCnt <> 1 Then
intDiff = (7 - intDayCnt + 1)
Else
intDiff = 0
End If
'Set date for first Sunday on or after start date
SunDate = DateAdd("d", intDiff, dtmStartDate)
stopDate = SunDate
Do While stopDate < dtmEndDate
intSunCnt = intSunCnt + 1
stopDate = DateAdd("d", 7, stopDate)
Loop
tbSatSunCount = intSunCnt + intSatCnt
End Function
Function tbStrDay(intDayCnt)
'
'Warning intDayCnt must be a valid integer
'
'Return the text string of the day provided
Select Case intDayCnt
Case 1
tbStrDay = "Sunday"
Case 2
tbStrDay = "Monday"
Case 3
tbStrDay = "Tuesday"
Case 4
tbStrDay = "Wednesday"
Case 5
tbStrDay = "Thursday"
Case 6
tbStrDay = "Friday"
Case 7
tbStrDay = "Saturday"
End Select
End Function
Function tbValidDate(dtmDate)
'
'Test if provided date is valid
'
If IsEmpty(dtmDate) Then
' test if no date (Null)
tbValidDate = 0
ElseIf IsDate(dtmDate) Then
'its valid
tbValidDate = 1
Else
'its junk
tbValidDate = 0
End If
End Function