Hilfe bei sql-satement / Prozedur

20/02/2010 - 13:33 von Peter Brosi | Report spam
Hallo,

ich habe eine Tabelle wie folgt:

workplace_id, state_reason, start_date, end_date, qty_sico

471 SETUP_01 01.02.2010 13:00:00 01.02.2010 16:25:34 0
471 PRODUCTION 01.02.2010 16:25:34 02.02.2010 03:28:39 5
471 FAULT_UNDEF 02.02.2010 03:28:39 02.02.2010 03:29:05 500
471 FAULT_02 02.02.2010 03:29:05 02.02.2010 06:00:00 505
471 PRODUCTION 02.02.2010 06:00:00 03.02.2010 02:34:21 520
471 IDLE_01 03.02.2010 02:34:21 1050


Ich will nun eine Auswertun in der ich eine Abgrenzung nach Tagen habe.
z.B. Zeile 2
Hier will ich die Zeit 16:25:34 - 0 Uhr zum 01.02.2010 haben
und die Zeit von 0 Uhr - 03:28:39 zum 2.2.haben


Wie kann man das in SQL auswerten ?
Geht das mit einem normalen SQL-Statemnent oder muß man hier eine Prozedur machen.
Wer kann mir hier eine Lösungsmöglichkeit zeigen, oder wo gibt es einen Link
bei dem ich die Problemstellung nachlesen kann

Aus einer Zeile per sql das Datum zu extrahieren habe ich so getestet.

select workplace_id, state_reason, start_date, end_date,
datepart(day,start_date) As Start,
datepart(day,end_date) As Ende,
datediff(s,start_date,'2010-02-18 23:59:59.999'),
datediff(s,'2010-02-19 00:00:00',end_date)
from workplaceaccount

Aber wie kann ich hier jetzt eine Auswertung kriegen in der ich nach Tagen die Summe der state_reason
und die summe der Mengen kriege. Die Menge für z.B. Zeile 2 ist die Menge der nachfolgenden Zeile minus
der Menge der Zeile 2
(
Die Menge aus dem Signalcollector der SPS wird immer bei Zustandswechsel eingetragen )
Ende des Produktionsintervall der Zeile 5 wird bei der Zeile 6 als qty_sico eingetragen.
Das bedeutet die Menge des Abschnittes Zeile 5 ist 1050 - 520 = 530
)

Gruß

Peter Brosi
 

Lesen sie die antworten

#1 Peter Brosi
20/02/2010 - 20:45 | Warnen spam
Ich habe hier mal eine Lösung gemacht, aber ich hoffe das geht einfacher
und effizienter wie meine
Ich schreibe in eine neue virtuelle Tabelle, wenn eine Zeitspanne den gleichen Tag hat
dann schreibe ich 1 Satz,
Wenn sie einen Tag hat dann schreibe ich 2 Sàtze in die virtuelle Tabelle

Wenn sie mehr als 2 Tage hat müßte ich die Lösung erweitern,
so daß für den ersten Tag die Zeitspanne start_date bis 23:59:59.999 berechnet wird,
für die Tage zwischen start_date und end_date die zeit 24 stunden ist
und für das end_date die Zeit 00:00:00.000 bis end_date berechnet wird.
Hier würde meine Lösung noch nicht tun.

Wie würdet ihr die unten gezeigte Lösung optimieren
( mit schleifendurchlauf )


Gruß

Peter Brosi

Lösung:
'Erzeugen virtuelle Tabelle
declare
@workplacereport as table
(
bookid int,
wpid varchar(64),
statereason varchar(64),
Tag varchar(2),
Monat varchar(2),
Jahr varchar(4),
Zeit int,
startzeit datetime,
endzeit datetime
);


Einfügen aller Datensàtze wo die Zeitspanne innerhalb des gleichen Tages liegt
insert into @workplacereport
select booking_id,
workplace_id,
state_reason,
Datepart(day, start_date),
Datepart(month, start_date),
Datepart(year, start_date),
DateDiff(mi, start_date, end_date),
start_date,
end_date
from workplaceaccount
where workplace_id='472'
and datediff(day, start_date, end_date) = 0;

Einfügen aller Datensàtze wo die Zeitspanne =1 ist
insert into @workplacereport
select booking_id,
workplace_id,
state_reason,
Datepart(day, start_date),
Datepart(month, start_date),
Datepart(year, start_date),
DateDiff(mi, start_date,Left(convert(varchar(19),start_date,120),10) + ' 23:59:59.999'),
start_date,
end_date
from workplaceaccount
where workplace_id='472'
and datediff(day, start_date, end_date) = 1;

insert into @workplacereport
select booking_id,
workplace_id,
state_reason,
Datepart(day, end_date),
Datepart(month, end_date),
Datepart(year, end_date),
DateDiff(mi, Left(convert(varchar(19),start_date,120),10) + ' 23:59:59.999', end_date),
start_date,
end_date
from workplaceaccount
where workplace_id='472'
and datediff(day, start_date, end_date) = 1;


select wpid, statereason, Tag, Monat, Jahr, Sum(Zeit) from @workplacereport
group by wpid, Tag, Monat, Jahr, statereason

Ähnliche fragen