garyrobbins
asked on
Last Monday of October
Hello All
I am curious to see if there is a cleaner way to query by the last monday in october of the previous year. I have the below and it works but i am sure there is a cleaner way to do it that i am not thinking of.
>=
IIf(Weekday(DateSerial(Yea r(Date())- 1,10,31),1 )=1,DateSe rial(Year( Date())-1, 10,31-6),
IIf(Weekday(DateSerial(Yea r(Date())- 1,10,31),1 )=7,DateSe rial(Year( Date())-1, 10,31-5), IIf(Weekday(DateSerial(Yea r(Date())- 1,10,31),1 )=6,DateSe rial(Year( Date())-1, 10,31-4), IIf(Weekday(DateSerial(Yea r(Date())- 1,10,31),1 )=5,DateSe rial(Year( Date())-1, 10,31-3), IIf(Weekday(DateSerial(Yea r(Date())- 1,10,31),1 )=4,DateSe rial(Year( Date())-1, 10,31-2), IIf(Weekday(DateSerial(Yea r(Date())- 1,10,31),1 )=3,DateSe rial(Year( Date())-1, 10,31-1), IIf(Weekday(DateSerial(Yea r(Date())- 1,10,31),1 )=2,DateSe rial(Year( Date())-1, 10,31),"ER ROR")))))) )
I am curious to see if there is a cleaner way to query by the last monday in october of the previous year. I have the below and it works but i am sure there is a cleaner way to do it that i am not thinking of.
>=
IIf(Weekday(DateSerial(Yea
IIf(Weekday(DateSerial(Yea
ASKER
how would you use that as the criteria?
Are you talking about a critieria in a query?
SELECT * FROM yourTable
WHERE [DateField] >= (
SELECT Max(DateSerial(Year(Date() )-1,10,[ln gNumber])) AS LastMonday
FROM qry_Numbers
WHERE (Weekday(DateSerial(Year(D ate())-1,1 0,[lngNumb er]),1)=1)
AND (qry_Numbers.lngNumber Between 1 And 31)
)
SELECT * FROM yourTable
WHERE [DateField] >= (
SELECT Max(DateSerial(Year(Date()
FROM qry_Numbers
WHERE (Weekday(DateSerial(Year(D
AND (qry_Numbers.lngNumber Between 1 And 31)
)
I've attached a database full of date functions. Look at the second tab to see this one in action.
Here is a function that will do it:
Pass in November 1st and a 2 for Monday
Here is a function that will do it:
Pass in November 1st and a 2 for Monday
Function fDateDayPrevious(dtmDate As Date, bytDaySought As Byte) As Date
' Function to return the date of the named day previous to the passed date
' Accepts:bytDaySought (e.g.: vbSunday)
' dtmDate as date
If bytDaySought - WeekDay(dtmDate) <= 0 Then
fDateDayPrevious = dtmDate + bytDaySought - WeekDay(dtmDate)
Else
fDateDayPrevious = dtmDate + bytDaySought - WeekDay(dtmDate) - 7
End If
End Function
UsefulDateFunctions160822WorksWith64.zip
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
You can use this generic function for finding a weekday of a month:
>= DateWeekdayInMonth(DateSer ial(Year(D ate) - 1, 10, 1), 5, vbMonday)
or in a query:
>=DateWeekdayInMonth(DateS erial(Year (Date())-1 ,10,1),5,2 )
/gustav
' Calculates the date of the occurrence of Weekday in the month of DateInMonth.
'
' If Occurrence is 0 or negative, the first occurrence of Weekday in the month is assumed.
' If Occurrence is 5 or larger, the last occurrence of Weekday in the month is assumed.
'
' If Weekday is invalid or not specified, the weekday of DateInMonth is used.
'
' 2016-06-10. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function DateWeekdayInMonth( _
ByVal DateInMonth As Date, _
Optional ByVal Occurrence As Integer, _
Optional ByVal Weekday As VbDayOfWeek = -1) _
As Date
Const DaysPerWeek As Long = 7
Dim Offset As Integer
Dim Month As Integer
Dim Year As Integer
Dim ResultDate As Date
' Validate Weekday.
Select Case Weekday
Case _
vbMonday, _
vbTuesday, _
vbWednesday, _
vbThursday, _
vbFriday, _
vbSaturday, _
vbSunday
Case Else
' Zero, none or invalid value for VbDayOfWeek.
Weekday = VBA.Weekday(DateInMonth)
End Select
' Validate Occurrence.
If Occurrence <= 0 Then
Occurrence = 1
ElseIf Occurrence > 5 Then
Occurrence = 5
End If
' Start date.
Month = VBA.Month(DateInMonth)
Year = VBA.Year(DateInMonth)
ResultDate = DateSerial(Year, Month, 1)
' Find offset of Weekday from first day of month.
Offset = DaysPerWeek * (Occurrence - 1) + (Weekday - VBA.Weekday(ResultDate) + DaysPerWeek) Mod DaysPerWeek
' Calculate result date.
ResultDate = DateAdd("d", Offset, ResultDate)
If Occurrence = 5 Then
' The latest occurrency of Weekday is requested.
' Check if there really is a fifth occurrence of Weekday in this month.
If VBA.Month(ResultDate) <> Month Then
' There are only four occurrencies of Weekday in this month.
' Return the fourth as the latest.
ResultDate = DateAdd("d", -DaysPerWeek, ResultDate)
End If
End If
DateWeekdayInMonth = ResultDate
End Function
Then:>= DateWeekdayInMonth(DateSer
or in a query:
>=DateWeekdayInMonth(DateS
/gustav
Have something similar, which checks if the date is the last monday of the month using T-SQL.
The following select will return 1 if the current date is the last monday of the month, and 0 if not
select
case
when datepart(dw, GETDATE()) = 2 and DATEPART(month, DATEADD(day, 7, GETDATE())) <> DATEPART(month, GETDATE())
then 1
else 0
end
---
datepart(dw, GETDATE()) returns the day of the week. Monday is 2. The second part adds 7 days to the current date and checks that within 7 days the month has changed (if it does not, it is not the last monday). Change the GETDATE()'s to any date you want to check.
The following select will return 1 if the current date is the last monday of the month, and 0 if not
select
case
when datepart(dw, GETDATE()) = 2 and DATEPART(month, DATEADD(day, 7, GETDATE())) <> DATEPART(month, GETDATE())
then 1
else 0
end
---
datepart(dw, GETDATE()) returns the day of the week. Monday is 2. The second part adds 7 days to the current date and checks that within 7 days the month has changed (if it does not, it is not the last monday). Change the GETDATE()'s to any date you want to check.
You can also try to make it into a generic function and use it with any date you like:
CREATE FUNCTION
IsLastMondayOfMonth(@dateT oCheck datetime)
RETURNS bit
AS
BEGIN
DECLARE
@result bit
SELECT @result =
CASE
WHEN datepart(dw, @dateToCheck) = 2 AND DATEPART(month, DATEADD(day, 7, @dateToCheck)) <> DATEPART(month, @dateToCheck)
THEN 1
ELSE 0
END
RETURN @result
END
CREATE FUNCTION
IsLastMondayOfMonth(@dateT
RETURNS bit
AS
BEGIN
DECLARE
@result bit
SELECT @result =
CASE
WHEN datepart(dw, @dateToCheck) = 2 AND DATEPART(month, DATEADD(day, 7, @dateToCheck)) <> DATEPART(month, @dateToCheck)
THEN 1
ELSE 0
END
RETURN @result
END
ASKER
This is exactly what I was looking for, Thank you.
SELECT Max(DateSerial(Year(Date()
FROM qry_Numbers
WHERE (Weekday(DateSerial(Year(D
AND (qry_Numbers.lngNumber Between 1 And 31);