Kurze Plausibilitätsprüfung
DECLARE @datum DATETIME
DECLARE @fruehSchichtStart SMALLDATETIME
DECLARE @fruehSchichtEnde SMALLDATETIME
DECLARE @normalZeitEnde SMALLDATETIME
DECLARE @spaetSchichtEnde SMALLDATETIME
SET @fruehSchichtStart = '1.1.1900 00:00'
SET @fruehSchichtEnde = '1.1.1900 06:00'
SET @normalZeitEnde = '1.1.1900 22:00'
SET @spaetSchichtEnde = '2.1.1900 00:00'
SET @datum = '20.05.2008'
;
WITH Cte([PalAzId],[ID],[KST],[Datum],[Beginn],[Ende],
RealerBeginn, RealesEnde, DauerMinuten, Schicht)
AS
(
--Frühschicht
SELECT *,
Beginn AS RealerBeginn,
(CASE
WHEN ende < @fruehSchichtEnde THEN ende
ELSE @fruehSchichtEnde
END) AS RealesEnde,
DATEDIFF(mi, Beginn,
(CASE
WHEN ende < @fruehSchichtEnde THEN ende
ELSE @fruehSchichtEnde
END)
) AS DauerMinuten,
'Frueh' AS Schicht
FROM PalAz
WHERE Datum=@datum
AND Beginn>=@fruehSchichtStart
AND DATEDIFF(mi, Beginn,
(CASE
WHEN ende < @fruehSchichtEnde THEN ende
ELSE @fruehSchichtEnde
END)
)>0
UNION
--Normalzeit
SELECT *,
(CASE
WHEN Beginn > @fruehSchichtEnde THEN Beginn
ELSE @fruehSchichtEnde
END) AS RealerBeginn,
(CASE
WHEN ende < @normalZeitEnde THEN ende
ELSE @normalZeitEnde
END) AS RealesEnde,
DATEDIFF(
mi,
(CASE
WHEN Beginn > @fruehSchichtEnde THEN Beginn
ELSE @fruehSchichtEnde
END),
(CASE
WHEN ende < @normalZeitEnde THEN ende
ELSE @normalZeitEnde
END)
) AS DauerMinuten,
'Normal' AS Schicht
FROM PalAz
WHERE Datum=@datum
AND
((Beginn>=@fruehSchichtEnde AND beginn < @normalZeitEnde)
OR (ende > @fruehSchichtEnde ))
AND DATEDIFF(
mi,
(CASE
WHEN Beginn > @fruehSchichtEnde THEN Beginn
ELSE @fruehSchichtEnde
END),
(CASE
WHEN ende < @normalZeitEnde THEN ende
ELSE @normalZeitEnde
END)
)>0
UNION
--Spätschicht
SELECT *,
(CASE
WHEN Beginn > @normalZeitEnde THEN Beginn
ELSE @normalZeitEnde
END) AS RealerBeginn,
(CASE
WHEN ende < @spaetSchichtEnde THEN ende
ELSE @spaetSchichtEnde
END) AS RealesEnde,
DATEDIFF(
mi,
(CASE
WHEN Beginn > @normalZeitEnde THEN Beginn
ELSE @normalZeitEnde
END),
(CASE
WHEN ende < @spaetSchichtEnde THEN ende
ELSE @spaetSchichtEnde
END)
) AS DauerMinuten,
'Spät' AS Schicht
FROM PalAz
WHERE Datum=@datum
AND (Beginn>=@normalZeitEnde OR Ende>@normalZeitEnde)
)SELECT SUM(DauerMinuten) FROM Cte
--Prüfung (es muss bei beiden das gleiche rauskommen)
SELECT SUM( DATEDIFF(mi, beginn, ende)) FROM palaz Ob das jetzt gut ist oder nicht, weiß ich nicht. Vielleicht gibt's eine elegantere Lösung?
Es scheint baer zu gehen. Man muss noch die Bedingungen prüfen, ob sie immer auch richtig sind, d.h. überall "kleiner gleich" steht, wo es auch hin soll, oder ob da eigentlich ein "kleiner als" hingehört etc. Da habe ich jetzt nicht so genau hingeguckt. |