Cuestión : ¿Cómo mantener las fechas de una tabla de la historia alineó sin boquetes?

Hola, el

I tiene que mantener una tabla de la historia, donde dado una nueva entrada o un expediente es actualizado, se reconstruye o se realinea la tabla (solamente para los expedientes con la misma identificación). No debe haber boquetes entre los expedientes. Cada expediente tiene un StartDate y un EndDate. Debajo está el esquema de la tabla: TABLA del

CREATE [dbo]. [Historia] IDENTIDAD del bigint (del
[HistoryID] (1, 1) NO FALTA DE INFORMACIÓN,
[identificación] internacional NO NULO, fecha y hora del
[StartDate] NO NULA, FALTA DE INFORMACIÓN datetime del
[EndDate], FALTA DE INFORMACIÓN del tinyint del
[estado], LLAVE PRIMARIA del CONSTREÑIMIENTO del
[History_pk] ARRACIMADA ([HistoryID]), el
GO

Here del
ON del
del CONSTREÑIMIENTO del
[History_uq] ([identificación], [StartDate])) es datos de la muestra con las fechas alineadas: el

The DateFormat es identificación StartDate EndDate Status
1 1 de dd/mm/yyyy

HistoryID 01/01/2010 10/01/2010 1
2 1 11/01/2010 15/01/2010 2
3 1 16/01/2010 20/01/2010 3

Rules: El
1. se libra de cualquier fila que esté enteramente dentro de la gama de la nueva fila que es insertada o de updated.
example: el

INSERT EN el extremo ResultSet del

The del
VALUES (1, “01/01/2010”, “17/01/2010”, 2) de la historia (identificación, StartDate, EndDate, estado) debe ser como sigue: la identificación StartDate EndDate Status
6 1 del
HistoryID del
01/01/2010 17/01/2010 2
3 1 18/01/2010 20/01/2010 3

Note que el expediente con HistoryID=3 tiene el StartDate aumentó en 1 debido a el EndDate del de registro anterior (6) es mayor que el StartDate del expediente debajo (3), que la gama era a partir de la 16/01/2010 a 20/01/2010.

The el mismo comportamiento debe aplicarse si el usuario hace una actualización en cualquier expediente en cualquier .

Following del campo (StartDate, EndDate, estado) el resultset anterior, deja el PARTE MOVIBLE más datos en la identificación StartDate EndDate Status
6 1 de table.

HistoryID 01/01/2010 17/01/2010 2
3 1 18/01/2010 20/01/2010 3

INSERT EN historia (

ResultSet del
VALUES (1, “05/01/2010”, “10/01/2010”, 1) de la identificación, de StartDate, de EndDate, del estado) después del parte movible: la identificación StartDate EndDate Status
6 1 del

HistoryID 01/01/2010 04/01/2010 2
7 1 05/01/2010 10/01/2010 1
8 1 11/01/2010 17/01/2010 2
3 1 18/01/2010 20/01/2010 3

Now el usuario cambia el expediente con HistoryID=3, con la ACTUALIZACIÓN folowing:
StartDate='17/01/2010', DETERMINADO EndDate='19/01/2010', Status=1
WHERE HistoryID=3

Resultset del
UPDATE: identificación StartDate EndDate Status
6 1 del

HistoryID 01/01/2010 04/01/2010 2
7 1 05/01/2010 10/01/2010 1
8 1 11/01/2010 16/01/2010 2
3 1 17/01/2010 19/01/2010 1
9 1 20/01/2010 20/01/2010 PARTE MOVIBLE de 3


Another:

INSERT EN el

Resultset del
VALUES (1, “01/01/2010”, “18/01/2010”, 1) de la historia (identificación, StartDate, EndDate, estado): identificación StartDate EndDate Status
10 1 del

HistoryID 01/01/2010 19/01/2010 1
9 1 20/01/2010 20/01/2010 3

Note que los expedientes 7.8.3 fueron suprimidos. El nuevo expediente agregado lleva el EndDate modificado 19/01/2010 debido a el EndDate del expediente no 3 tenía el mismo estado, ese los medios, que no hay necesidad de guardar o de modificar el expediente no 3 tampoco, apenas para tomar el EndDate de él y ponerlo en el record.

I no saber alcanzar este resultado junto con el comportamiento expuesto aquí. No sé si su mejor hacerlo como disparador o escribir un procedimiento para insertar expedientes y hacer todo el trabajo en it.

That´s él. ¡Si hay cualquier duda sobre las reglas, déjame por favor know.

Thanks! respetos del

Best,

Marco André
class= del

Respuesta : ¿Cómo mantener las fechas de una tabla de la historia alineó sin boquetes?

hola Marco,

El gran número de expedientes puede introducir problemas de funcionamiento en ambos panoramas. El problema básico sobre funcionamiento es siempre igual: Probar todos los panoramas y comparar los resultados.

Encontrar su expediente de historia correcto es simple:

SELECCIONAR la TAPA 1 * DE [HistoryTable] DONDE [la fecha] <>
Usted puede utilizar una función definida por el usario del tabla-valor para calcular este expediente, pero no puedo conjeturar sobre su funcionamiento. Hay quizá un fresco ensambla, pero no puedo imaginarme uno ahora;)

El usuario múltiple que los problemas están iguales en ambas soluciones, él es el mismo problema sobre atomicidad que en el problema bien conocido de la transferencia de la cuenta bancaria. Usted necesita un control explícito de la transacción que encapsula su lógica y un nivel del aislamiento de leído confía o mejora.

mfG
--> Stefan <-->
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
SELECCIONAR  *
    [EventTable] de E
        La CRUZ SE APLICA [dbo]. [FindHistory] (E. [identificación], E. [EventDate]) H;

-- con

CREAR la FUNCIÓN [FindHistory]
    (
      @ID COMO INTERNACIONAL,
      @EVENTDATE COMO FECHA Y HORA
    )
TABLA DE LAS VUELTAS
COMO
VUELTA
    (TAPA SELECTA 1
                H.*
            [HistoryTable] de H
      DONDE     H.ID = @ID
                Y H. [HistoryDate] = @EventDate
      ORDEN POR  H. [HistoryDate] DESC
    )
Otras soluciones  
 
programming4us programming4us