Hallo an alle!
Ich tüfftle bei meinem Problem schon seit einigen Tagen, komme aber irgendwie nciht weiter.
Ich habe zwei Tabellen.
1. Tabelle wo jeder Datensatz ein Tag ist.
ID;Tag
1;1.5.2009
2;2.5.2009
usw.
2. Tabelle in der Zeitbereiche angegeben sind
ID;von;bis
1;1.5.2009 7:30;1.5.2009 16:00
2;1.5.2009 13:00;4.5.2009 16:00
usw.
Ich möhte nun die beiden Tabellen (wenn möglich in einem schritt) so verbinden, das ich für jeden Tag die Anzahl der Stunden bekomme, welche die Zeitbereiche haben.
Also für die beiden obrigen beispiele:
ID;Tag;Stunden
1;1.5.2009;19.5 (Summe alles Stunden vom 1.5 in allen DS der Tabelle 2)
2;2.5.2009;24
3;3.5.2009;24
4;4.5.2009;16
usw.
Hat da jemand für mich einen Tipp wie man so etwas auflöst?
Danke für alle Antworten im voraus!
Wilfried
Meinst Du so etwas?
declare @tab1 as table(id integer, datum datetime);
declare @tab2 as table(id integer, von datetime, bis datetime);
insert into @tab1 values(1, '2009-05-01');
insert into @tab1 values(2, '2009-05-02');
insert into @tab1 values(3, '2009-05-03');
insert into @tab1 values(4, '2009-05-04');
insert into @tab2 values(1, '2009-05-01 07:30', '2009-05-01 16:00');
insert into @tab2 values(2, '2009-05-01 13:00', '2009-05-04 16:00');
select * from @tab1;
select * from @tab2;
select a.id, a.datum,
case
when convert(varchar(8),b.von,112) < convert(varchar(8), a.datum, 112) then cast(convert(varchar(10), a.datum, 120) as datetime)
else b.von
end as Anfang,
case
when convert(varchar(8),b.bis,112) > convert(varchar(8), a.datum, 112) then cast(convert(varchar(10), a.datum, 120) as datetime)+1
else b.bis
end as Ende
from @tab1 a,
@tab2 b
where convert(varchar(8), a.datum, 112) between convert(varchar(8),b.von,112) and convert(varchar(8),b.bis,112);
select id, datum, datediff(mi,Anfang, Ende ) as Dauer
from (
select a.id, a.datum,
case
when convert(varchar(8),b.von,112) < convert(varchar(8), a.datum, 112) then cast(convert(varchar(10), a.datum, 120) as datetime)
else b.von
end as Anfang,
case
when convert(varchar(8),b.bis,112) > convert(varchar(8), a.datum, 112) then cast(convert(varchar(10), a.datum, 120) as datetime)+1
else b.bis
end as Ende
from @tab1 a,
@tab2 b
where convert(varchar(8), a.datum, 112) between convert(varchar(8),b.von,112) and convert(varchar(8),b.bis,112)
) x;
select min(id) as id, convert(varchar(10),datum,104), sum(datediff(mi,Anfang, Ende )/60.0) as Dauer_Stunden
from (
select a.id, a.datum,
case
when convert(varchar(8),b.von,112) < convert(varchar(8), a.datum, 112) then cast(convert(varchar(10), a.datum, 120) as datetime)
else b.von
end as Anfang,
case
when convert(varchar(8),b.bis,112) > convert(varchar(8), a.datum, 112) then cast(convert(varchar(10), a.datum, 120) as datetime)+1
else b.bis
end as Ende
from @tab1 a,
@tab2 b
where convert(varchar(8), a.datum, 112) between convert(varchar(8),b.von,112) and convert(varchar(8),b.bis,112)
) x
group by datum;
Einen schönen Tag noch,
Christoph Muthmann
Microsoft SQL Server MVP