Update
Borrowing from @highfive's answer, the easiest way to do this is use the DAY_ONLY
operator to convert the DateTime.
SELECT Id FROM Case WHERE DAY_ONLY(ClosedDate) >= :startOfMonth
AND DAY_ONLY(ClosedDate) <= :endOfMonth
Old Answer
So it seems like there are four options. I'd probably go for the last one, which seems the clearest and simplest. In hindsight this question appears subjective and probably not right for the forum =.
First, you can use @sathya's suggestion which works but might be counter-intuitive if you don't understand the date to datetime conversion that's happening.
Date startOfMonth = Date.newInstance(2012,9,1);
Date endOfMonth = Date.newInstance(2012,10,1);
List<Case> cases = [
select id from Case
where closedDate >= :startOfMonth
and closedDate <= :endOfMonth];
Second, you can exactly specify the date time window. Which works but feels a little verbose.
DateTime startOfMonthDT = DateTime.newInstance(2012,9,1,0,0,0);
DateTime endOfMonthDT = DateTime.newInstance(2012,9,30,23,59,59);
List<Case> cases = [
select id from Case
where closedDate >= :startOfMonthDT
and closedDate <= :endOfMonthDT];
Third, if you're only worrying about the current or last month you can use date literals.
List<Case> cases = [
select id from Case
where closedDate = LAST_MONTH];
Finally, you can use the date functions, which seems like the clearest (to me at least)
Integer month = 9;
Integer year = 2012;
List<Case> cases = [
select id from Case
where CALENDAR_MONTH(closedDate) = :month
and CALENDAR_YEAR(closedDate) = :year];
Confirming @Eric, your query
List<CustomObj__c> list = [SELECT Name
FROM CustomObj__c
WHERE Expense__Date__c = THIS_MONTH];
is validated by the following:
I tried out a version of your query myself, and it worked fine.
Though this is besides the point (the Date Literals work), there is always the option of "rolling your own" by something like the following:
Date startOfMonth = Date.today().toStartOfMonth();
Date startOfNextMonth = startOfMonth.addMonths(1);
List<CustomObj__c> list = [SELECT Name
FROM CustomObj__c
WHERE Expense__Date__c >= :startOfMonth
AND Expense_Date__c < :startOfNextMonth];
Best Answer
As far as how that function can be used in a query, it would look something lie:
However, you could instead use
DAY_IN_WEEK
and save yourself the trouble of calculating which dates you need:Note that
1
representsSunday
, and7
representsSaturday
. SinceSaturday - 1 = Friday
, you should use a value of6
If you wanted to query records created on Fridays in a particular month/year, it would look like:
You could also add an overload that accepts just a date within the month to filter:
It might just be worth reading up on all Date Functions.