WHERE Clause to find all records in a specific month
I want to be able to give a stored procedure a Month and Year and have it return everything that happens in that month, how do I do this as I can't compare between as some months have different numbers of days etc?
What's the best way to do this? Can I just ask to compare based on the year and month?
Thanks.
Solution 1:
I think the function you're looking for is MONTH(date)
. You'll probably want to use 'YEAR' too.
Let's assume you have a table named things
that looks something like this:
id happend_at
-- ----------------
1 2009-01-01 12:08
2 2009-02-01 12:00
3 2009-01-12 09:40
4 2009-01-29 17:55
And let's say you want to execute to find all the records that have a happened_at
during the month 2009/01 (January 2009). The SQL query would be:
SELECT id FROM things
WHERE MONTH(happened_at) = 1 AND YEAR(happened_at) = 2009
Which would return:
id
---
1
3
4
Solution 2:
Using the MONTH and YEAR functions as suggested in most of the responses has the disadvantage that SQL Server will not be able to use any index there may be on your date column. This can kill performance on a large table.
I would be inclined to pass a DATETIME value (e.g. @StartDate) to the stored procedure which represents the first day of the month you are interested in.
You can then use
SELECT ... FROM ...
WHERE DateColumn >= @StartDate
AND DateColumn < DATEADD(month, 1, @StartDate)
If you must pass the month and year as separate parameters to the stored procedure, you can generate a DATETIME representing the first day of the month using CAST and CONVERT then proceed as above. If you do this I would recommend writing a function that generates a DATETIME from integer year, month, day values, e.g. the following from a SQL Server blog.
create function Date(@Year int, @Month int, @Day int)
returns datetime
as
begin
return dateadd(month,((@Year-1900)*12)+@Month-1,@Day-1)
end
go
The query then becomes:
SELECT ... FROM ...
WHERE DateColumn >= Date(@Year,@Month,1)
AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))
Solution 3:
More one tip very simple to oracle db. You also could use to_char function, look:
For Month:
to_char(happened_at , 'MM') = 01
For Year:
to_char(happened_at , 'YYYY') = 2009
For Day:
to_char(happened_at , 'DD') = 01
to_char funcion is suported by sql language and not by one specific database.
I hope help anybody more...
Abs!
Solution 4:
As an alternative to the MONTH and YEAR functions, a regular WHERE clause will work too:
select *
from yourtable
where '2009-01-01' <= datecolumn and datecolumn < '2009-02-01'