public long Daybetween(String date1,String date2,String pattern)
{
SimpleDateFormat sdf = new SimpleDateFormat(pattern,Locale.ENGLISH);
Date Date1 = null,Date2 = null;
try{
Date1 = sdf.parse(date1);
Date2 = sdf.parse(date2);
}catch(Exception e)
{
e.printStackTrace();
}
return (Date2.getTime() - Date1.getTime())/(24*60*60*1000);
}
Решение Oracle. Во второй строке помещен отчетный год.
mc
подсчитывает новые и уходящие лица в месяц t
- это иерархический подсчет подзапроса opening
и closing
для каждый месяц. Первая часть, якорь, подсчитывает записи в таблицах entry
и resign
в течение более старых лет, это наша отправная точка. К этому якорю мы прикладываем значения по месяцам, просматривая их в mc
pivot
и порядок, добавленный здесь только для представления данных по вашему запросу. Запрос:
with
y as (select 2016 yr from dual),
mc as (
select mm, sum(a) a, sum(c) c
from ( select extract (month from entrydate) mm, 1 a, 0 c
from entry, y where extract(year from entrydate) = yr
union all
select extract (month from resigndate) mm, 0 a, 1 c
from resign, y where extract(year from resigndate) = yr)
group by mm ),
t(mm, o, a, r, c) as (
select 0, 0, 0, 0,
( (select count(1) from entry where extract(year from entrydate) < yr)
- (select count(1) from resign where extract(year from resigndate) < yr) )
from y
union all
select t.mm + 1, t.c, mc.a, mc.c, t.c + nvl(mc.a, 0) - nvl(mc.c, 0)
from t left join mc on mc.mm = t.mm + 1
where t.mm + 1 <= 12)
select *
from (
select * from t
unpivot (cnt for type in (o, a, r, c)))
pivot (sum(cnt) for mm in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))
order by case type when 'O' then 1 when 'A' then 2
when 'R' then 3 when 'C' then 4
end
Результат для предоставленных данных и год 2016:
TYPE 1 2 3 4 5 6 7 8 9 10 11 12
---- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------
O 0 1 2 3 4 4 4 4 4 4 3 2
A 1 1 1 1 0 0
R 0 0 0 0 1 1
C 1 2 3 4 4 4 4 4 4 3 2 2
Это в основном стандартный SQL, вам могут потребоваться функции изменения, такие как extract
, на их эквивалент SQLServer , Надеюсь, это поможет.