Tabelle mit Tagesstungen aus Zeitbereichen erzeugen

3 replies [Letzter Beitrag]
wilgin
Offline
Joined: 20.12.2007
Beiträge:

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

Eigene Bewertung: Keines Durchschnitt: 5 (1 Bewertung)
Muthmann
Offline
Joined: 20.12.2007
Beiträge:

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

wilgin
Offline
Joined: 20.12.2007
Beiträge:
12.75

Hallo!
Super!!
Danke vielmals ... auch für die Zwischenschritte. Mein Fehler war bei den vergleichen der Datumsfelder.
Gruß!
Wilfried

wilgin
Offline
Joined: 20.12.2007
Beiträge:
12.75

Hallo!
Super!!
Danke vielmals ... auch für die Zwischenschritte. Mein Fehler war bei den vergleichen der Datumsfelder.
Gruß!
Wilfried