2017-10-02 2 views
0

Ich habe eine Tabelle, die die Statuszeit für ein Projekt speichert, und um eine Lebensdauer von jedem Projekt zu bekommen, ich muss nur eine SUMME der Datumsunterschiede und Im Set, das Problem kommt, wenn ich andere einschließen stammt aus dem anderen Tisch „Interruptions“ genannt, wird die Unterbrechungen Tabelle wie folgt:Gesamtlebensdauer zwischen den Datensätzen

|_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 

ich brauche die Unterbrechungen Zeit von der gesamten Lebenszeit zu nehmen, aber in diesem Fall, dass Sie zwei Unterbrechungen (siehe 5 und 6), das vom 9/12/2017 bis 9/20/2017, insgesamt (ohne Wochenenden) 6 Tage, also eine normale SUMME dieser Aufzeichnungen ist 6 Tage + 6 Tage + 1 Tag, insgesamt 13 Tage, aber realistisch sollte es ein sein insgesamt 7 Tage der Unterbrechungen nur, da # 5 und 6 im selben Zeitraum passiert sind, es sollte der gleiche Fall sein, auch wenn zum Beispiel # 5 vom 9/12/17 bis 9/19/17 (5 Tage) und # 6 vom 9/11/17 bis zum 9/20/17 (7 Tage) war, dies sollte 7 Tage (ohne Wochenenden) sein, wenn ich eine Unterbrechung hatte # 7 vom 9/22/17 bis 9/22/2017 (1 Tag) sagen, ich sollte insgesamt 7 Tage + 1 Tag = 8 Tage

haben

hoffe, ich bin dies richtig formuliert,

was wäre der effizienteste Weg, um dies anzugehen?

Dank im Voraus

EDITED

Projektzeittabelle (Sehr ähnlich)

|_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 

Hinweis: Diese Status Zeit aufeinander folgend sind und sich nicht überlappen, ist es das Flussprojekt, springen Sie zu einem neuen Status nach Abschluss der aktuellen

+0

Warum würden 7 # auch nicht überlappen, da sie auf 9/20 ist? – Shawn

+0

könnte es überlappen, aber es gibt Fälle, in denen es Zeitlücken zwischen Unterbrechungen gibt, das war nur ein Beispiel, das ich zur Hand hatte – ebiteye5973

+0

Auch welche Version von SQL Server? – Shawn

Antwort

0

Ihr Problem ist mir nicht ganz klar, vor allem der Hauptteil, dh "to get a lifetime of each project "

Bitte erläutern Sie Ihr Problem erneut, wenn meine Ausgabe falsch ist. Immer noch wird mein Skript Ihnen helfen, die Lösung zu finden.

Ich denke Hauptproblem zu finden ist „Total distinct interruption Time“ jedes Projekt

Dazu Sie einen Dauer Datum Kalender haben kann table.In mein Beispiel es temporäre Tabelle ist.

Beispieldaten

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') 

Wie "Total deutlicher Tag Unterbrechungszeit" ohne Wochenende

Haupt Trick passiert hier zu finden. also musst du das nur testen und lass es mich wissen.

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 

Wenn die Ausgabe korrekt sind, dann können Sie über Kommentar „Select“ gehen Sie wie folgt,

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 
Verwandte Themen