¿Cómo trabajar con SQL: 2011 en tiempo de aplicación las tablas de época
Considere un ejemplo utilizando tablas de tiempo de aplicación de períodos de SQL. Supongamos que una empresa quiere hacer un seguimiento de lo que el departamento de sus empleados pertenecen en cualquier momento durante su período de empleo. La empresa puede hacer esto mediante la creación de tablas período de tiempo de aplicación para los empleados y departamentos:
Conteúdo
CREAR employee_atpt MESA (EmpID INTEGER, EmpStart FECHA, EmpEnd FECHA, EmpDept VARCHAR (30), el plazo de EmpPeriod (EmpStart, EmpEnd)) -
La fecha y hora de inicio (EmpStart en el ejemplo) se incluye en el período, pero la fecha y hora de finalización (EmpEnd en el ejemplo) no lo es. Esto se conoce como la semántica cerrado abiertos.
INSERT INTO employee_atptVALUES (12.345, FECHA '2011-01-01', FECHA '9999-12-31', 'Ventas') -
La tabla resultante tiene una fila, como se muestra en la Tabla 7-1.
EmpID | EmpStart | EmpEnd | EmpDept |
---|---|---|---|
12345 | 01/01/2011 | 9999-12-31 | Ventas |
La fecha de finalización de 9999-12-31 indica que el mandato de este empleado con la empresa no ha terminado todavía.
Supongamos ahora que el 15 de marzo de 2012, 12.345 empleados se asigna temporalmente al departamento de Ingeniería hasta el 15 de julio de 2012 de volver al departamento de ventas a partir de entonces. Usted puede lograr esto con el siguiente ACTUALIZACIÓN declaración:
ACTUALIZACIÓN employee_atptFOR PARTE DEL EmpPeriodFROM FECHA '2012-03-15'TO FECHA' 2012-07-15'SET EmpDept = 'Engineering'WHERE EmpID = 12345-
Después de la actualización, la mesa ahora tiene tres filas.
EmpID | EmpStart | EmpEnd | EmpDept |
---|---|---|---|
12345 | 01/01/2011 | 03/15/2012 | Ventas |
12345 | 03/15/2012 | 07/15/2012 | Ingeniería |
12345 | 07/15/2012 | 9999-12-31 | Ventas |
Suponiendo empleado 12.345 aún se emplea en el departamento de ventas, la tabla registra con precisión su membresía departamento del día de Año Nuevo de 2011 hasta la actualidad.
Eliminación de datos de una tabla de período de tiempo de aplicación puede ser un poco más complicado que simplemente eliminar filas de una mesa no temporal ordinaria. A modo de ejemplo, supongamos que ese empleado 12.345 sale de la empresa en 15 de marzo de 2012and es contratado nuevamente el 15 de julio del mismo año. Inicialmente, la tabla período de tiempo de aplicación tendrá una fila.
EmpID | EmpStart | EmpEnd | EmpDept |
---|---|---|---|
12345 | 01/01/2011 | 9999-12-31 | Ventas |
LA BORRAR declaración actualizará la tabla para mostrar el período durante el cual 12.345 empleados se había ido:
BORRAR employee_atptFOR PARTE DEL EmpPeriodFROM FECHA '2012-03-15'TO FECHA' 2012-07-15'WHERE EmpID = 12345-
EmpID | EmpStart | EmpEnd | EmpDept |
---|---|---|---|
12345 | 01/01/2011 | 03/15/2012 | Ventas |
12345 | 07/15/2012 | 9999-12-31 | Ventas |
La tabla refleja ahora los períodos de tiempo durante el cual los empleados 12345 fue empleado por la empresa y muestra la distancia en la que ella no era empleado de la empresa.
Un tiempo de aplicación mesa periodo de empleados puede contener varias filas para un solo empleado. El número de identificación de empleado, por sí mismo, no se puede utilizar como clave principal de la tabla. Los datos temporales se deben añadir a la mezcla.
Cómo designar las claves principales en la aplicación en tiempo tablas de época
Para garantizar que no hay duplicación de filas, la fecha de inicio (EmpStart) y la fecha final (EmpEnd) deben ser incluidos en la clave principal. Sin embargo, sólo su inclusión no es suficiente. Considere el caso en que los empleados 12345 fue trasladado a la Ingeniería durante unos meses, y luego regresó a su departamento de casa.
EmpID | EmpStart | EmpEnd | EmpDept |
---|---|---|---|
12345 | 01/01/2011 | 9999-12-31 | Ventas |
12345 | 03/15/2012 | 07/15/2012 | Ingeniería |
Observe que los dos períodos de tiempo se superponen. Parece empleado 12345 es un miembro tanto del departamento de ventas y el departamento de Ingeniería del 15 de marzo de 2012 hasta el 15 de julio 2012.
Esto añade complicación y podría conducir a la corrupción de datos. La aplicación de una restricción que dice que un empleado puede ser un miembro de un único departamento a la vez es quizás lo que la mayoría de las organizaciones querrían hacer. Usted puede agregar una restricción de este tipo a una tabla con un ALTER TABLE declaración como la siguiente:
ALTER TABLE employee_atptADD PRIMARY KEY (EmpID, EmpPeriod sin superposiciones) -
Hay una forma mejor de hacer las cosas de la creación de una mesa de primera y añadiendo su restricción de clave principal más adelante - en su lugar, puede incluir la restricción de clave primaria en el original CREAR comunicado. Podría ser similar al siguiente:
CREATE TABLE employee_atptEmpID INTEGER NOT NULL, EmpStart FECHA NO NULO, FECHA EmpEnd NOT NULL, EmpDept VARCHAR (30), el plazo de EmpPeriod (EmpStart, EmpEnd) PRIMARY KEY (EmpID, EmpPeriod sin superposiciones)) -
Cómo aplicar restricciones de referencia a tiempo la aplicación tablas de época
Cualquier base de datos que tiene la intención de mantener más que una simple lista de artículos probablemente requerirá varias tablas. Si una base de datos tiene varias tablas, las relaciones entre las tablas deben ser definidos, y restricciones de integridad referencial se deben poner en su lugar.
Tiene un tiempo de aplicación mesa periodo empleado y un tiempo de aplicación mesa periodo departamento. Hay una relación de uno a varios entre la tabla y el departamento de la tabla de empleados, porque un departamento puede tener varios empleados, pero cada empleado pertenece a uno y sólo un departamento.
Esto significa que usted necesita para poner una clave externa en la tabla de empleados que hace referencia a la clave principal de la tabla departamento. Con esto en mente, utilice una más completa CREAR declaración, y crear una mesa de departamento:
CREAR employee_atpt MESA (EmpID INTEGER NOT NULL, EmpStart FECHA NO NULO, FECHA EmpEnd NOT NULL, EmpName VARACHAR (30), EmpDept VARCHAR (30), el plazo de EmpPeriod (EmpStart, EmpEnd) PRIMARY KEY (EmpID, EmpPeriod sin superposiciones) FOREIGN KEY (EmpDept, EmpPeriod PERIODO) Referencias dept_atpt (DeptID, DeptPeriod PERIODO)) - CREAR dept_atpt MESA (DeptID VARCHAR (30) NOT NULL, Gerente VARCHAR (40) NOT NULL, DeptStart FECHA NO NULO, DeptEnd FECHA NO NULO, PERIODO PARA DeptTime ( DeptStart, DeptEnd), PRIMARY KEY (DeptID, DeptTime sin superposiciones)) -
Cómo consultar en tiempo de aplicación las tablas de época
Ahora, la información detallada se puede recuperar de la base de datos mediante el uso de SELECT declaraciones que hacen uso de los datos temporales.
Una cosa que usted puede ser que desee hacer es hacer una lista de todas las personas que están actualmente empleados por la organización. Incluso antes de SQL: 2011, podría hacerlo con una declaración similar a la siguiente:
* SELECT FROM employee_atptWHERE EmpStart lt; = CURRENT_DATE () y EmpEnd> CURRENT_DATE () -
Con el nuevo PERIODO sintaxis, usted puede conseguir el mismo resultado un poco más fácil, así:
* SELECT FROM employee_atptWHERE EmpPERIOD CONTIENE CURRENT_DATE () -
También puede recuperar los empleados que fueron empleados durante un período específico de tiempo, así:
SELECT * FROM employee_atptWHERE EmpPeriod OVERLAPSPERIOD (DATE ('2012-01-01'), DATE ('09/16/2012')) -