Получить данные пользователя в форматированном виде с помощью запроса Sql

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);
}
8
задан marc_s 13 July 2018 в 12:34
поделиться

2 ответа

1
ответ дан Ross Bush 17 August 2018 в 12:59
поделиться

Решение 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 , Надеюсь, это поможет.

1
ответ дан Ponder Stibbons 17 August 2018 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: