Effektiver Query für diese Abfrage

T

Thallius

Guest
Hi,

ich habe eine Tabelle

Code:
CREATE TABLE "public"."order_tools" (
  "tool_number" varchar(50)  NOT NULL,
  "start_date" date NOT NULL,
  "end_date" date NOT NULL
)

In der gespeichert wird wenn ein Tool für einen Auftrag gebucht wird.

Wenn ich nun einen neuen Auftrag anlegen will, muss ich checken ob das tool in der Zeit verfügbar ist UND wieviele Tage zwischen dem vorherigen und dem nächsten Auftrag liegen. Ich bauche also von einer Date-Range FirstDate-LastDate des neuen Auftrages, den Eintrag in der Tabelle der am nächsten vor dieser Date-Range liegt und den Eintrag der am dichtesten dahinter folgt natürlich auch wenn diese die gewünschte Date-Range überlappen so das eine Planung gar nicht geht.

Jemand eine gute Idee wie man das möglichst performant machen kann?
 
Werbung:
vermutlich willst Du verhindern, daß ein Tool mehrfach mit überlappenden Zeitraum da eingebucht wird, oder?

Code:
postgres=# create extension btree_gist;
CREATE EXTENSION
postgres=# create table order_tools(tool_id int, von_bis daterange, exclude using gist(tool_id with =, von_bis with &&));
CREATE TABLE
postgres=# insert into order_tools values (42, '[2022-11-01, 2022-11-10)');
INSERT 0 1
postgres=# select count(*) from order_tools where tool_id=42 and von_bis = '[2022-11-02, 2022-11-08)';
 count 
-------
     0
(1 row)

postgres=# select count(*) from order_tools where tool_id=42 and von_bis && '[2022-11-02, 2022-11-08)';
 count 
-------
     1
(1 row)

postgres=# select count(*) from order_tools where tool_id=42 and von_bis && '[2022-10-02, 2022-10-08)';
 count 
-------
     0
(1 row)

postgres=# insert into order_tools values (42, '[2022-11-02, 2022-11-08)');
ERROR:  conflicting key value violates exclusion constraint "order_tools_tool_id_von_bis_excl"
DETAIL:  Key (tool_id, von_bis)=(42, [2022-11-02,2022-11-08)) conflicts with existing key (tool_id, von_bis)=(42, [2022-11-01,2022-11-10)).
postgres=# insert into order_tools values (42, '[2022-10-02, 2022-10-08)');
INSERT 0 1
postgres=#

Du kannst also abfragen, ob ein Eintrag sich überschneiden würde. Ein Versuch, diesen zu speichern, scheitert, wenn es sich überlappt.
 
Das wäre zu einfach. Ich muss wirklich die beiden Einträge (also den davor und den dahinter) auslesen denn ich muss mit der zeitdifferenz zwischen Ende des letzen und Anfang des geplanten und Ende des geplante und Start des nächsten, jede Menge rum Rechnen da dort noch transport Tage (je nach Art des transporteurs unterschiedlich viele), Cooldown Tage für radioaktive Werkzeuge etc hinzukommen. es kann sogar vorkommen, das unter bestimmten Voraussetzungen, es möglich ist Überlappungen zu buchen.
 
Werbung:

Ähnliche Themen

Zurück
Oben