You can do that if you have analytic (aka window) functions available (Oracle, SQL Server, Postgresql, MySQL). The basic idea would be (using Oracle SQL dialect):
select
sum(trunc(next_date) - trunc(dat))
from (
select
status,
dat,
lead(dat) over (order by dat asc) next_date
from
( -- This is a "fake" data table
select 1 as status, to_date('15/2/2018' ,'dd/mm/yyyy') dat from dual
union all
select 2 as status, to_date('18/2/2018' ,'dd/mm/yyyy') dat from dual
union all
select 3 as status, to_date('20/2/2018' ,'dd/mm/yyyy') dat from dual
union all
select 2 as status, to_date('23/2/2018' ,'dd/mm/yyyy') dat from dual
union all
select 4 as status, to_date('24/2/2018' ,'dd/mm/yyyy') dat from dual
union all
select 7 as status, to_date('27/2/2018' ,'dd/mm/yyyy') dat from dual
union all
select 9 as status, to_date('28/2/2018' ,'dd/mm/yyyy') dat from dual
union all
select 3 as status, to_date('1/3/2018' ,'dd/mm/yyyy') dat from dual
union all
select 14 as status, to_date('4/3/2018' ,'dd/mm/yyyy') dat from dual
union all
select 15 as status, to_date('7/3/2018' ,'dd/mm/yyyy') dat from dual
union all
select 1 as status, to_date('10/3/2018' ,'dd/mm/yyyy') dat from dual
union all
select 2 as status, to_date('14/3/2018' ,'dd/mm/yyyy') dat from dual
) d
) d2
where
status in (1, 3);
Other dialects may be slightly different but the idea is the same.