2017-10-02 2 views
0

J'ai une table qui stocke l'heure d'état d'un projet, et pour obtenir une durée de vie de chaque projet, je dois exécuter une somme des différences de date et d'im set, le problème survient lorsque j'inclus d'autres dates d'autres tables appelées « interruptions », la table des interruptions se présente comme suit:Durée de vie totale entre les enregistrements

|_ID_| |_PROJ_| |_COMMENTS_| |_START_| |_END_| 
---- 
5 -- 1080 -- testing 1 -- 9/12/2017 -- 9/20/2017 
6 -- 1080 -- testing 2 -- 9/12/2017 -- 9/20/2017 
7 -- 1080 -- testing 3 -- 9/20/2017 -- 9/20/2017 

je dois être prendre le temps d'interruption de la durée de vie totale, mais dans ce cas, vous voyez 2 interruptions (5 et 6) qui sont du 9/12/2017 au 20/09/2017, totalisant (sans week-ends) 6 jours chacun, donc une somme normale de ces enregistrements est 6 jours + 6 jours + 1 jour, total 13 jours, mais de manière réaliste, il devrait être un total de 7 jours d'interruptions seulement depuis # 5 et 6 sur la même période, ça devrait être le même cas même si par exemple le n ° 5 était du 9/12/17 au 19/09/17 (5 jours) et le n ° 6 était du 9/11/17 au 20/09/17 (7 jours), cela devrait être 7 jours (sans week-end), si j'ai eu une interruption # 7 dire du 22/09/17 au 22/09/2017 (1 jour) je devrais avoir un total de 7 jours + 1 jour = 8 jours

J'espère que je suis en train de formuler ce droit,

quel serait le moyen le plus efficace pour y remédier?

merci à l'avance

ÉDITÉ

table de temps du projet (très similaire)

|_ID_| |_PROJ_| |_STATUS_| |_START_| |_END_| 
---- 
1 -- 1080 -- 19 -- 9/8/2017 -- 9/12/2017 
2 -- 1080 -- 20 -- 9/12/2017 -- 9/20/2017 
2 -- 1080 -- 26 -- 9/20/2017 -- 9/20/2017 

Note: Ces temps d'état sont consécutives et ne se chevauchent pas, son flux de projet, vous sautez seulement à un nouveau statut après avoir terminé le cours d'une

+0

Pourquoi serait-# 7 se chevauchent pas non plus car il est sur 9/20? – Shawn

+0

il pourrait se chevaucher, mais il y a des cas où il ya des intervalles de temps entre les interruptions, c'était juste un exemple que j'avais à portée de main – ebiteye5973

+0

Aussi, quelle version de SQL Server? – Shawn

Répondre

0

votre problème est pas tout à fait clair pour moi, en particulier la partie principale-à-dire "to get a lifetime of each project "

Veuillez ré-expliquer votre problème si ma sortie est incorrecte. Toujours mon script vous aidera à trouver la solution.

Je pense que problème principal est de trouver « Total distinct interruption Time » de chaque projet

Pour cela, vous pouvez avoir un calendrier permanent Date de table.In mon exemple est table temporaire.

Données d'échantillons

declare @Interruption table(_ID_ int,_PROJ_ int,_COMMENTS_ varchar(50),_START_ date,_END_ date) 
insert into @Interruption VALUES 
    (5 , 1080 ,'testing 1','9/12/2017','9/20/2017') 
,(6 , 1080 ,'testing 2','9/12/2017','9/20/2017') 
,(7 , 1080 ,'testing 3','9/20/2017','9/20/2017') 

declare @project table(_ID_ int,_PROJ_ int,_STATUS_ int,_START_ date,_END_ date) 
insert into @project values 
(1 ,1080 ,19,'9/8/2017', '9/12/2017') 
,(2 ,1080 ,20,'9/12/2017','9/20/2017') 
,(2 ,1080 ,26,'9/20/2017','9/20/2017') 

Comment trouver "temps d'interruption totale de jour distincte" hors week-end

astuce principale se produire ici. donc vous devez tester cela seulement et faites le moi savoir.

create table #exmDate(datecol date primary key) 
insert into #exmDate 
select dateadd(day,c.rn,'01/01/2017') 
from(
select row_number()over(order by number)rn from master..spt_values)c 

select e.*,c._PROJ_ from #exmDate e 
CROSS apply(select _PROJ_, min(_START_)_START_,max(_END_) _END_ from @Interruption group by _PROJ_)c 
where datecol>=c._START_ 
and datecol<=c._END_ 
and DATENAME(dw, datecol) not in('Friday','Saturday','Sunday') 



drop table #exmDate 

Si la sortie est correcte, vous pouvez commenter ci-dessus « Sélectionnez » procéder comme ci-dessous,

create table #exmDate(datecol date) 
insert into #exmDate 
select dateadd(day,c.rn,'01/01/2017') 
from(
select row_number()over(order by number)rn from master..spt_values)c 

--select e.*,c._PROJ_ from #exmDate e 
--CROSS apply(select _PROJ_, min(_START_)_START_,max(_END_) _END_ from @t group by _PROJ_)c 
--where datecol>=c._START_ 
--and datecol<=c._END_ 
--and DATENAME(dw, datecol) not in('Friday','Saturday','Sunday') 

;with CTE as 
(
select e.datecol,c._PROJ_ from #exmDate e 
CROSS apply(select _PROJ_, min(_START_)_START_,max(_END_) _END_ from @Interruption group by _PROJ_)c 
where datecol>=c._START_ 
and datecol<=c._END_ 
and DATENAME(dw, datecol) not in('Friday','Saturday','Sunday') 
) 
,cte1 AS(
select _PROJ_ ,sum(DATEDIFF(day,_START_,_END_)) TotalProjectTime 
from @project p 
group by p._PROJ_ 
) 
select _PROJ_ ,TotalProjectTime -c.TotalInterruptiontime 
from cte1 p 
cross apply(select count(*)TotalInterruptiontime from CTE where _PROJ_=p._PROJ_ group by _proj_)c 


drop table #exmDate