Berechnung von Produktionsdauer

Hallo Leute,
ich habe folgendes Problem:
Zuerst einmal vielleicht, dass die Datentabellen noch nicht produktiv aufgebaut sind also kann hier noch das Richtige gesetzt bzw. ver�ndert werden.

Ich muss eine Produktionsdauerberechnung durchf�hren die folgende Randbedingungen enth�lt.

  1. Es gibt eine Tabelle in der die aktive Produktionsdauer hinterlegt ist (z.B Startzeit 08:00 / Endzeit 22:00 ), k�nnte ich also dementsprechend als TIME Feld hinterlegen.
  2. Ich kann die Produktionsdauer nicht in einem TIME Feld erfassen, da sie �ber 24 Stunden sein kann. ( z.B 30:00 h )
  3. Der Planer verplant nun die Produktion anhand des Datums und einer Startzeit (z.B 02.02.2012 / 11:00 Uhr )

Und jetzt genau steh ich auf dem Schlauch da ich mir nicht im klaren bin, wie ich die Produktionsdauer so hinbiegen kann, dass ich auch mit ihr rechnen kann.

Sprich mir fehlt das Speicherformat der Produktionsdauer und die dann folgende Typumwandlung, damit ich damit auch rechnen kann.

Kann mir hier jemand einen Tip geben ?

Welche Version?

9.2 bringt RANGE-Typen, einfach geil. Da Du noch nicht produktiv bist, wäre das ja vielleicht ein Einsatzszenario für Dich.

Deine Probleme habe ich vielleicht nicht wirklich verstanden, aber hier Beipsiel mit den von Dir genannten Zahlen:

test=*# select '[2012-02-02 08:00,2012-02-02 22:00)'::tsrange;
                    tsrange
-----------------------------------------------
 ["2012-02-02 08:00:00","2012-02-02 22:00:00")
(1 row)

test=*# select lower('[2012-02-02 08:00,2012-02-02 22:00)'::tsrange) + '11hour'::interval;
      ?column?
---------------------
 2012-02-02 19:00:00
(1 row)

test=*# select lower('[2012-02-02 08:00,2012-02-02 22:00)'::tsrange) + '30hour'::interval;
      ?column?
---------------------
 2012-02-03 14:00:00
(1 row)

Du kannst auch prüfen, ob ein RANGE-Wert in einen anderen reinpaßt, möglicherweise suchst Du sowas:

test=*# select   '[2012-02-02 08:00,2012-02-03 22:00)'::tsrange -  '[2012-02-02 08:00,2012-02-02 22:00)'::tsrange ;
                   ?column?
-----------------------------------------------
 ["2012-02-02 22:00:00","2012-02-03 22:00:00")
(1 row)

Also, die Produktion würde von heute 08Uhr bis morgen 22Uhr gehen, die Maschinenzeit ist aber nur 8-22, der Bereich von heute 22 bis morgen 22Uhr bleibt übrig, das ist:

test=*# select upper('[2012-02-02 22:00:00,2012-02-03 22:00:00)'::tsrange) - lower('[2012-02-02 22:00:00,2012-02-03 22:00:00)'::tsrange);
 ?column?
----------
 1 day
(1 row)

Andreas

Version 9.1
Mein Problem ist die Produktionsdauer, da ich die ja nicht in ein TIME Feld reinpacken kann, da sie größer als 24h sein kann.

Anhand meiner Beispieldaten nochmals das Szenario

In der Stammdatenpflege wird die Produktionsdauer x festgelegt.
Die Planung bekommt den Datensatz und schaut sich den Produktionsplan an.
Sie setzen den Produktionsstart auf 02.02.2012 / 11:00 Uhr
Jetzt will er natürlich sehen wann die Produktion fertig ist
Dh: unter Berücksichtigung der realen Arbeitszeit 08:00 - 22:00 Uhr
02.02 / 11:00 - 22:00 / 11h / Rest 19h
03.02 / 08:00 - 22:00 / 14h / Rest 5h
04.02 / 08:00 - 13:00 / Ende
dh. ich muss ihm 04:02 / 13:00 auf den Schrim bringen, wobei ich wie gesagt ein Problem habe mit dem Format der Produktionsdauer, da diese ja größer 24:00 sein kann.

Hoffe das ist etwas deutlicher

Ja, dann nimm halt INTERVAL:

test=*# select '30hour'::interval;
 interval
----------
 30:00:00
(1 row)

test=*# select now() + '30hour'::interval;
           ?column?
-------------------------------
 2012-02-03 19:32:17.068123+01
(1 row)

Danke Andreas,

kommt davon wenn man vor lauter Bäumen den Wald nicht mehr sieht :sunglasses:

Da ich keine Chance habe auf den RANGE Wert zu warten hätte ich vielleicht doch noch eine Frage.

Die Logik dahinter denke ich mal ist mir klar, nur an der Umsetzung in Postgres habert es noch.
Ausgehend von meinem obigen Beispiel würde ich ja jetzt meiner Meinung nach folgendes berechnen

Wenn die Startzeit ( 11:00 ) + Produktionsdauer ( 30:00 ) > als Schichtende ( 22:00 Uhr ) ist,
setze Datum = Datum +1
Produktionsende = Schichtende ( 22:00 ) - Startzeit (11:00 ) + ( Schichtende (22:00) - Schichtanfang (08:00) )
damit hab ich dann den Tag durch und den Rest der Produktionszeit.
Wie kann ich das verpacken, dass ich so lange weiterrechne bis das Produktionsende < dem Schichtende ist damit ich das tatsächlieche Enddatum/Zeit habe ?

Du könntest das in eine Funktion packen. Du könntest auch z.B. mit INT-Werten für die Minuten (oder Sekunden, ich kenne Deine Zeitauflösung nicht) rechnen und dann mit numerischen Operatoren wie / und % arbeiten. Mindestens tausend Wege …


Andreas

Jetzt sag bloß das euer Hosting immer noch auf 9.1 läuft …