Voy a "desoxidarme" mi estimado Fernando, para resolver el problema que planteas la manera mas viable a mi parecer es con procedimientos almacenados.
Primero un SP general que devuelva las veces que se repita un día en un rango de fechas. Este SP no tiene nada que ver con tu BD, se obtiene directamente de Firebird.
SET TERM ^ ;
CREATE OR ALTER PROCEDURE DIAS_ENTRE_FECHAS (
DIA INTEGER,
INICIO DATE,
FIN DATE)
RETURNS (
NUMERO_DIAS INTEGER)
AS
DECLARE variable DIFERENCIA_DIAS INTEGER;
DECLARE variable CONTADOR INTEGER;
DECLARE variable TEMP_DIA INTEGER;
DECLARE variable VAR_DIAS INTEGER;
BEGIN
CONTADOR = 0;
TEMP_DIA = 0;
VAR_DIAS = 0;
SELECT datediff(DAY FROM :INICIO TO :FIN)
FROM RDB$DATABASE
INTO DIFERENCIA_DIAS;
while (CONTADOR <= DIFERENCIA_DIAS) do
BEGIN
SELECT EXTRACT(weekday FROM (:INICIO + :CONTADOR))
FROM RDB$DATABASE
INTO TEMP_DIA;
IF (TEMP_DIA = :DIA) THEN
VAR_DIAS = VAR_DIAS + 1;
CONTADOR = CONTADOR + 1;
END
NUMERO_DIAS = :VAR_DIAS;
END^
SET TERM ; ^
En este punto ya podemos lanzar otro SP que haga la consulta:
CREATE OR ALTER PROCEDURE CONSULTA (
INICIO DATE,
FIN DATE)
RETURNS (
DIA VARCHAR(10),
CANTIDAD INTEGER,
TOTAL_DIAS INTEGER,
PROMEDIO NUMERIC(15,2))
AS
DECLARE variable VAR_CANTIDAD INTEGER;
DECLARE variable VAR_DIA VARCHAR(10);
DECLARE variable VAR_NUM_DIA INTEGER;
BEGIN
FOR SELECT COUNT(PK_ot_preventivo), EXTRACT(weekday FROM CAST(ot_fecha AS DATE)),
CASE
WHEN EXTRACT(weekday FROM CAST(ot_fecha AS DATE)) = 0 THEN 'DOMINGO'
WHEN EXTRACT(weekday FROM CAST(ot_fecha AS DATE)) = 1 THEN 'LUNES'
WHEN EXTRACT(weekday FROM CAST(ot_fecha AS DATE)) = 2 THEN 'MARTES'
WHEN EXTRACT(weekday FROM CAST(ot_fecha AS DATE)) = 3 THEN 'MIERCOLES'
WHEN EXTRACT(weekday FROM CAST(ot_fecha AS DATE)) = 4 THEN 'JUEVES'
WHEN EXTRACT(weekday FROM CAST(ot_fecha AS DATE)) = 5 THEN 'VIERNES'
WHEN EXTRACT(weekday FROM CAST(ot_fecha AS DATE)) = 6 THEN 'SABADO'
END
FROM ot_preventivo
WHERE (CAST(ot_fecha AS DATE) BETWEEN :INICIO AND :FIN)
AND (ot_status = 4)
GROUP BY EXTRACT(weekday FROM CAST(ot_fecha AS DATE))
INTO VAR_CANTIDAD, VAR_NUM_DIA, VAR_DIA
do
BEGIN
DIA = VAR_DIA;
CANTIDAD = VAR_CANTIDAD;
EXECUTE PROCEDURE DIAS_ENTRE_FECHAS(VAR_NUM_DIA, INICIO, FIN)
returning_values TOTAL_DIAS;
PROMEDIO = CANTIDAD / TOTAL_DIAS;
suspend;
END
END^
SET TERM ; ^
Para contar le he pasado la clave primaria de tu tabla.
Luego puedes llamarla en tu aplicación con una consulta muy sencilla:
SELECT * FROM CONSULTA(FECHA_INICIO, FECHA_FINAL)
A mi me funciona correctamente, si te atoras en algún lado me avisas.