TSQL - рассчитывать на дату - PullRequest
0 голосов
/ 31 мая 2018

возможно ли сделать статистику по запросам, начиная с данных, настроенных таким образом?

Таблица a: реестр

id (key)
name

в состоянии b: праздничные дни

id (key)
id_anagrafica (foreign key)
data_start
data_end

Запрос:

SELECT b.id, a.name, b.start_date, b.end_date
FROM registry to INNER JOIN
      holidays b ON (a.id = b.id_anagrafica)
WHERE b.start_date> = getdate ()

Таким образом, я получаю:

id, name, start_date, end_date
1, Mario, 01/06/2018, 30/06/2018
2, Marino, 08/06/2018, 25/06/2018
3, Maria, 01/07/2018, 05/07/2018
-
-
-

Имея только start_date и end_date, я не могу знать за день, сколько людей в отпуске.Что мне нужно, это:

data, num_pers_in_ferie
01/06/2018, 1
06/02/2018, 1
03/06/2018, 1
-
-
08/06/2018, 2

Можете ли вы помочь мне?

Заранее спасибо

1 Ответ

0 голосов
/ 31 мая 2018

Проверьте подход ниже

create table #registry (id int, name nvarchar(50))
 insert into #registry values
 (1, 'Mario'),
 (2, 'Marino'),
 (3, 'Maria')

create table #holidays (id int,id_anagrafica int,data_start date,data_end date)
insert into #holidays
select id, id, '2018-06-01', '2018-06-30'
from #registry

update #holidays set data_start = dateadd(day, 20, data_start), data_end = dateadd(day, -5, data_end)
where id = 2
update #holidays set data_start = dateadd(day, 14, data_start)--, data_end = dateadd(day, -10, data_end)
where id = 3


SELECT b.id, a.name, b.data_start, b.data_end
FROM #registry a
INNER JOIN
#holidays b ON (a.id = b.id_anagrafica)
WHERE b.data_start > = getdate ()

DECLARE @startDate DATETIME=CAST(MONTH(GETDATE()) AS VARCHAR) + '/' + '01/' +  + CAST(YEAR(GETDATE()) AS VARCHAR) -- mm/dd/yyyy
DECLARE @endDate DATETIME= GETDATE() -- mm/dd/yyyy

select  [DATA] = convert(date, DATEADD(Day,Number,@startDate)),
        --se ti serve in italiano usa la riga sotto
        --[DATA] = CONVERT(varchar, DATEADD(Day,Number,@startDate), 103)
        SUM(case when DATEADD(Day,Number,@startDate) between data_start and data_end then 1 else 0 end) Pers_in_Ferie
from    master..spt_values  c,
        #registry a
        INNER JOIN
        #holidays b ON (a.id = b.id_anagrafica)
where c.Type='P' and DATEADD(Day,Number,@startDate) >=data_start and DATEADD(Day,Number,@startDate) <=data_end
group by DATEADD(Day,Number,@startDate)
order by [DATA]



drop table #holidays
drop table #registry

Выход:

DATA       Pers_in_Ferie
---------- -------------
2018-06-01 1
2018-06-02 1
2018-06-03 1
2018-06-04 1
2018-06-05 1
2018-06-06 1
2018-06-07 1
2018-06-08 1
2018-06-09 1
2018-06-10 1
2018-06-11 1
2018-06-12 1
2018-06-13 1
2018-06-14 1
2018-06-15 2
2018-06-16 2
2018-06-17 2
2018-06-18 2
2018-06-19 2
2018-06-20 2
2018-06-21 3
2018-06-22 3
2018-06-23 3
2018-06-24 3
2018-06-25 3
2018-06-26 2
2018-06-27 2
2018-06-28 2
2018-06-29 2
2018-06-30 2

(30 rows affected)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...