Примерно так можно выбрать цифры, в данном случае от 1 до 2999.
Select Rownum year
From dual
Connect By Rownum <= 2999
Примерно так можно проверить, является ли конкретный год високосным или нет
CASE WHEN ((MOD(YEAR, 4) = 0 AND (MOD(YEAR, 100) <> 0)) OR MOD(year, 400) = 0) THEN 1 ELSE 0 END as isLeapYear
Теперь вам просто нужно добавить фильтрацию и сумму високосных лет.
Select sum(isLeapYear)
from (
Select year, CASE WHEN ((MOD(YEAR, 4) = 0 AND (MOD(YEAR, 100) <> 0)) OR MOD(year, 400) = 0) THEN 1 ELSE 0 END as isLeapYear
FROM (
Select Rownum year
From dual
Connect By Rownum <= 2999
) a
Where a.year >= EXTRACT(YEAR FROM DATE %DateStart%) and a.year <= EXTRACT(YEAR FROM DATE %DateEnd%)
) b
Это может быть действительно улучшено с точки зрения производительности, но вот так я думаю, что это прощепоймите, что делает каждый шаг, и тогда вы сможете разложить его на то, что вы действительно хотите и ожидаете.