Wenn du das wirklich nur für diese Auswertung brauchst, dann geht das so
Code:
CREATE TABLE PROD (
ID BIGINT NOT NULL,
TXT VARCHAR(80),
ANZAHL INTEGER,
ZEIT TIMESTAMP);
select
cast(prod.zeit-.25 as date) schichtdatum,
CASE
WHEN (EXTRACT(HOUR FROM prod.ZEIT) BETWEEN 8 and 13) then 1
WHEN (EXTRACT(HOUR FROM prod.ZEIT) BETWEEN 14 and 21) then 2
else 3
end schicht,
sum(prod.anzahl)
from prod
group by 1,2
In Firebird kann das aber auch als berechnetes Feld erstellt werden, welches du
dann sogar via Expression Index indizieren kannst (War Thema bei der Schulung
in Wardenburg an den Tagen wo du nicht da warst
, ist aber in Köln auch
wieder Thema). Berechnete Felder belegen keinen eigenen Speicherplatz (abgesehen
vom Eintrag in rdb$relation_fields) und können wie jedes andere Feld auch
in anderen SQLs benutzt werden.
Wenn deine Schicht bis 6:00 Uhr geht kann du das Tagesdatum der Schicht immer aus
"Zeit - 0.25" berechnen (Mittags um 12 ist 0.5, Nachmittags 18:00 Uhr ist 0.75 usw.)
Beispiel DDL
Code:
/******************************************************************************/
/**** Generated by IBExpert 02.06.2013 08:55:48 ****/
/******************************************************************************/
CREATE TABLE PROD (
ID BIGINT NOT NULL,
TXT VARCHAR(80),
ANZAHL INTEGER,
ZEIT TIMESTAMP,
SCHICHTDATUM COMPUTED BY (CAST (ZEIT-0.25 as date)),
SCHICHT COMPUTED BY (CASE
WHEN (EXTRACT(HOUR FROM ZEIT) BETWEEN 8 and 13) then 1
WHEN (EXTRACT(HOUR FROM ZEIT) BETWEEN 14 and 21) then 2
else 3
end)
);
ALTER TABLE PROD ADD PRIMARY KEY (ID);
CREATE INDEX PROD_IDX1 ON PROD COMPUTED BY (SCHICHT);