Вы можете использовать LAG или LEAD аналитические функции:
select stock_date, lead(stock_date, 1, null) over (order by stock_date) next_date
from stock_table
, а затем использовать результат запроса для ввода, то есть:
SELECT find_usage_from_stock(t.product_id, t.start_date, t.end_date) as usage_from_stock,
find_prodcuts_sold(t.product_id, t.start_date, t.end_date) as prodcuts_sold,
t.product_id, t.start_date
FROM (select stock_date as start_date,
lead(stock_date, 1, null) over (order by stock_date) as end_date,
product_id
from stock_table) t
Примечание: я использовал ноль в качестве пустого значения в функции отведения, возможно, вам нужно будет добавить что-то еще