Hola de nuevo palmach:
En realidad estás hablando de dos consultas distintas, es decir en una estás involucrando rangos de fechas, por lo tanto la condición de filtrado del WHERE debería quedar así:
Código:
WHERE
fecha BETWEEN
DATE_FORMAT(pFechaFinal,'%Y/%m/01') AND
DATE_SUB(pFechaFinal, INTERVAL 1 DAY);
Para que te arroje sólo lo de la fecha final en el mismo reporte no deberías utilizar BETWEEN, sino simplemente hacer una igualación:
Código:
WHERE
fecha = pFechaFinal;
De una vez que comento que no puedes hacer un WHERE CONDICIONAL, por si estás pensando en que se ponga una condición u otra... lo que puedes hacer en todo caso sería utilizar una sentencia preparada la cual construyas de manera dinámica y en donde decidas a partir de una condición qué condición incluir:
http://dev.mysql.com/doc/refman/5.0/es/sqlps.html
Otra alternativa en su defecto sería tener dos procedimientos almacenados distintos, uno para el rango y otro para una fecha en concreto.
Saludos
Leo.