Don't trunc() your dates, it spoils partitioning.
So I learned something interesting1 at work today. I had a query that was using "WHERE trunc(t1.create_date) = to_date(etc)". It turns out if you trunc() a date column, that ruins Oracle's ability to pick the proper partition(s) in a date-partitioned table. It ends up having to do a full table scan of all the partitions. Which of course is majorly slow and inefficient.
The solution for us was to use "WHERE t1.create_date BETWEEN to_date(blah) AND to_date(blah) + 1". This gives pretty much the same effect - matches dates after 11:59pm last night and midnight tonite. The explain plan still shows a full table scan, but also shows that it's only applied to 1 partition in the table, instead of all 40.
-----
1 And by "interesting" I of course mean "obscure, useless and trivial unless you're a super-nerd."