Query for condition over time
A slight variation of Vérace very detailed answer. The idea is to enumerate the rows per id, and per id plus, if the condition holds. I named the difference grp. If grp changes it means that there is a change to whether the condition holds. I.e. min and max grouped by grp will apply to intervals where condition either holds or fails.

I used a having clause for the duration condition. 

select id, min(the_time), max(the_time) -- min and max per interval
from (
    select id, the_value, the_time
         -- grp is an id for each interval
         , row_number() over (partition by id order by the_time) 
         - row_number() over (partition by id
                                 , case when the_value &lt; 10 
                                        then 1
                                        else 0 
                                   end 
                              order by the_time) as grp
    from tab
) as x
where the_value &lt; 10 -- intervals where condition holds
group by id, grp
having max(the_time) - min(the_time) &gt;= 4; -- duration


The added sample data results in:

1   3   9
1   11  15


It is possible to determine the condition in one place by nesting the query, but I'm not sure whether that is useful or not:

select id, MIN(the_time) AS min, MAX(the_time) AS max -- min and max per interval
from (
    select id, the_value, the_time, condition
         -- grp is an id for each interval
         , row_number() over (partition by id order by the_time) 
         - row_number() over (partition by id, condition 
                              order by the_time) as grp
   from (
       select id, the_value, the_time, the_value &lt; 10 as condition
       from tab
   ) as a
) as x
where condition -- intervals where condition holds
group by id, grp
having max(the_time) - min(the_time) &gt;= 4 -- duration
ORDER BY id, min;