I have never used PostGres, but clearly your answer can't be right.
Just the first line makes no sense:
If you had records such asthen that SELECT would *FORCE* you to get each of those times, INDIVIDUALLY.
SELECT extract(hour from oper_time) as hr, extract(minute from oper_time) as mn,count(*) as thecount
I'm 90% certain that you need to use the same FLOOR expression in the SELECT that you are using in the GROUP BY.
Except that the FLOOR expression is going to give you values of 0,1,2, and 3. Only. So it needs fixing, as well.
And, too, since you want to both group by and order by the date-alone, that needs to be in the SELECT.
SELECT CAST(oper_time as Date) AS dt,
extract(hour from oper_time) as hr,
floor(extract(minute from oper_time)/15) * 15 AS mn,
count(*) as thecount
FROM log WHERE CAST(oper_time As Date) >= '09/23/2010'
GROUP BY CAST(oper_time as Date),
extract(hour from oper_time),
floor(extract(minute from oper_time)/15) * 15
ORDER BY dt, hr, mn