So arbeiten Sie mit SQL: 2011 Anwendungszeitperiodentabellen

Betrachten wir ein Beispiel SQL-Anwendungs-Periodenzeittabellen verwendet. Angenommen, ein Unternehmen will, um zu verfolgen, was Abteilung seine Mitarbeiter gehören zu jederzeit während ihrer Beschäftigungszeit. Das Unternehmen kann dies tun, indem Anwendungszeitperiodentabellen für Mitarbeiter und Abteilungen zu schaffen:

CREATE TABLE employee_atpt (EmpID INTEGER, EmpStart DATE, EmpEnd DATE, EmpDept VARCHAR (30), FRIST EmpPeriod (EmpStart, EmpEnd)) -

Der Startdatetime (EmpStart im Beispiel) wird in der Periode erfasst, aber die Endung Datetime (EmpEnd in dem Beispiel) nicht. Dies wird als geschlossene offene Semantik bekannt.

INSERT INTO employee_atptVALUES (12345, DATE '2011-01-01', DATE '9999-12-31', 'Sales') -

Die resultierende Tabelle hat eine Zeile, wie in Tabelle 7-1 gezeigt.

EmpIDEmpStartEmpEndEmpDept
123452011-01-019999-12-31Der Umsatz

Das Enddatum der 9999-12-31 zeigt, dass diese Amtszeit des Mitarbeiters mit dem Unternehmen noch nicht beendet ist.

Nehmen wir nun an, dass am 15. März 2012 Mitarbeiter 12345 vorübergehend an der Engineering-Abteilung bis zum 15. Juli zugeordnet, 2012, auf die danach Verkaufsabteilung zurück. Sie können dies mit folgendem erreichen AKTUALISIEREN Erklärung:

UPDATE employee_atptFOR dem Angebot von EmpPeriodFROM DATUM '2012-03-15'TO DATUM' 2012-07-15'SET EmpDept = 'Engineering'WHERE EmpID = 12345-

Nach dem Update hat die Tabelle nun drei Zeilen.

EmpIDEmpStartEmpEndEmpDept
123452011-01-012012-03-15Der Umsatz
123452012-03-152012-07-15Ingenieurwesen
123452012-07-159999-12-31Der Umsatz

Unter der Annahme, Mitarbeiter 12345 noch in der Verkaufsabteilung beschäftigt ist, nimmt der Tabelle genau ihre Abteilung Mitgliedschaft aus Neujahrstag des Jahres 2011 bis zur Gegenwart.

Daten aus einem Anwendungszeitperiode Tabelle löschen kann ein wenig komplizierter als nur Löschen von Zeilen aus einem gewöhnlichen, nontemporal Tabelle sein. Als Beispiel wird angenommen, dass Mitarbeiter 12.345 verlässt das Unternehmen am 15. März von 2012and am 15. Juli wieder eingestellt ist aus dem gleichen Jahr. Zunächst wird der Anwendungszeitperiode Tabelle eine Zeile haben.

EmpIDEmpStartEmpEndEmpDept
123452011-01-019999-12-31Der Umsatz

EIN LÖSCHEN Anweisung aktualisiert die Tabelle, um die Zeit zu zeigen, während der Mitarbeiter 12.345 war verschwunden:

DELETE employee_atptFOR dem Angebot von EmpPeriodFROM DATUM '2012-03-15'TO DATUM' 2012-07-15'WHERE EmpID = 12345-
EmpIDEmpStartEmpEndEmpDept
123452011-01-012012-03-15Der Umsatz
123452012-07-159999-12-31Der Umsatz

Die Tabelle spiegelt nun die Zeiträume, in denen Mitarbeiter 12345 von der Firma beschäftigt war und zeigt die Lücke in der sie nicht von der Firma beschäftigt.

Ein Anwendungszeitperiodentabelle der Mitarbeiter mehrere Zeilen für einen einzelnen Mitarbeiter enthalten. Die Mitarbeiter-ID-Nummer, von selbst, ist nicht geeignet als der Primärschlüssel der Tabelle. Die zeitlichen Daten müssen zu der Mischung hinzugefügt werden.

Wie Primärschlüssel in Anwendungszeitperiode Tabellen zu benennen

Um zu gewährleisten, dass es keine Überschneidungen der Zeilen ist, das Startdatum (EmpStart) und Enddatum (EmpEnd) muss im Primärschlüssel enthalten sein. Allerdings nur, sie auch nicht ausreichend. Betrachten wir den Fall, wo Mitarbeiter 12345 wurde für ein paar Monate zu Technik übertragen und dann in ihre Heimatabteilung zurück.

EmpIDEmpStartEmpEndEmpDept
123452011-01-019999-12-31Der Umsatz
123452012-03-152012-07-15Ingenieurwesen

Beachten Sie, dass die beiden Zeiträume überlappen. Es sieht aus wie ein Mitarbeiter von 12.345 ist Mitglied sowohl der Verkaufsabteilung und der Engineering-Abteilung von 15. März 2012 bis 15. Juli 2012.

Dies fügt Komplikation und zu Datenkorruption führen könnte. Erzwingen eine Einschränkung, die besagt, dass ein Mitarbeiter zu einem Zeitpunkt ein Mitglied nur eine Abteilung sein kann vielleicht ist das, was die meisten Unternehmen tun wollen würde. Sie können mit ein, eine solche Einschränkung zu einer Tabelle hinzufügen ALTER TABLE Anweisung wie die folgenden:

ALTER TABLE employee_atptADD PRIMARY KEY (EmpID, EmpPeriod überschneidungsfrei) -

Es gibt einen besseren Weg, um Dinge zu tun, als eine Tabelle zuerst Erstellen und Hinzufügen von seiner Primärschlüsselbedingung später - stattdessen können Sie die Primärschlüsselbedingung im Original enthalten ERSTELLEN Erklärung. Es könnte wie folgt aussehen:

CREATE TABLE employee_atptEmpID INTEGER NOT NULL, EmpStart DATE NOT NULL, EmpEnd DATE NOT NULL, EmpDept VARCHAR (30), FRIST EmpPeriod (EmpStart, EmpEnd) PRIMARY KEY (EmpID, EmpPeriod überschneidungsfrei)) -

Wie Referenzrandbedingungen zu Anwendungszeitperiode Tabellen anzuwenden

Jede Datenbank, die gemeint ist, aufrecht zu erhalten mehr als eine einfache Liste der Elemente wird wahrscheinlich mehrere Tabellen erforderlich. Wenn eine Datenbank mehrere Tabellen hat, müssen die Beziehungen zwischen den Tabellen definiert werden, und referentielle Integritätsbedingungen müssen in Position gebracht werden.

Sie haben einen Mitarbeiter Anwendungszeitperiodentabelle und eine Abteilung Anwendungszeitperiode Tabelle. Es gibt eine Eins-zu-viele-Beziehung zwischen der Abteilungstabelle und der Mitarbeitertabelle, weil eine Abteilung mehrere Mitarbeiter haben, aber jeder Mitarbeiter gehört zu einer und nur einer Abteilung.

Dies bedeutet, dass Sie einen Fremdschlüssel in der Tabelle employee setzen müssen, die den Primärschlüssel der Abteilungstabelle verweist. In diesem Sinne, eine möglichst vollständige ERSTELLEN Anweisung und eine Abteilungstabelle zu erstellen:

CREATE TABLE employee_atpt (EmpID INTEGER NOT NULL, EmpStart DATE NOT NULL, EmpEnd DATE NOT NULL, EmpName VARACHAR (30), EmpDept VARCHAR (30), FRIST EmpPeriod (EmpStart, EmpEnd) PRIMARY KEY (EmpID, EmpPeriod überschneidungsfrei) FOREIGN KEY (EmpDept, PERIODE EmpPeriod) LITERATUR dept_atpt (DeptID, PERIODE DeptPeriod)) - CREATE TABLE dept_atpt (DeptID VARCHAR (30) NOT NULL, Leiter VARCHAR (40) NOT NULL, DeptStart DATE NOT NULL, DeptEnd DATE NOT NULL, FRIST DeptTime ( DeptStart, DeptEnd), PRIMARY KEY (DeptID, DeptTime überschneidungsfrei)) -

Wie abfragen Tabellen Anwendungszeitperiode

Nun können detaillierte Informationen aus der Datenbank abgerufen werden, unter Verwendung WÄHLEN Aussagen, die Verwendung der zeitlichen Daten machen.

Eine Sache, Sie vielleicht zu tun ist, alle Menschen zur Liste, die derzeit von der Organisation beschäftigt werden. Schon vor SQL: 2011, können Sie es mit einer Anweisung ähnlich wie folgt vorgehen:

SELECT * FROM employee_atptWHERE EmpStart lt; = CURRENT_DATE () und EmpEnd> CURRENT_DATE () -

Mit dem neuen PERIODE Syntax können Sie das gleiche Ergebnis ein wenig leichter, wie diese:

SELECT * FROM employee_atptWHERE EmpPERIOD ENTHÄLT CURRENT_DATE () -

Sie können auch Mitarbeiter abrufen, die während eines bestimmten Zeitraums verwendet wurden, etwa so:

SELECT * FROM employee_atptWHERE EmpPeriod OVERLAPSPERIOD (DATE ( '2012-01-01'), DATE ( '2012-09-16')) -

Menü