Pergunta : Como manter as datas de uma tabela da história alinhou sem aberturas?

Olá!, o

I tem que manter uma tabela da história, onde dado uma entrada nova ou um registro é atualizado, a tabela é recreada ou realinhada (somente para registros com a mesma identificação). Não deve haver nenhuma abertura entre os registros. Cada registro tem um StartDate e um EndDate. Abaixo está o esquema da tabela: TABELA do

CREATE [dbo]. [História] (IDENTIDADE do bigint do
[HistoryID] (1, 1) NAO NULA,
[identificação] int NAO NULO, datetime do
[StartDate] NAO NULO, ZERO datetime do
[EndDate], ZERO do tinyint do
[status], CHAVE PRELIMINAR do CONFINAMENTE do
[History_pk] AGLOMERADA ([HistoryID]), o
GO

Here do
ON do
do CONFINAMENTE do
[History_uq] ([identificação], [StartDate])) é uns dados da amostra com as datas alinhadas: o

The DateFormat é identificação StartDate EndDate Status
1 1 de dd/mm/yyyy

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

Rules:
1.Get livrado de algumas fileiras que estiverem inteiramente dentro da escala da fileira nova que estão sendo introduzidos ou de updated.
example: o

INSERT na extremidade ResultSet do

The do
VALUES da história (identificação, StartDate, EndDate, status) (1, “01/01/2010”, “17/01/2010”, 2) deve ser como segue: a identificação StartDate EndDate Status
6 1 do
HistoryID do
01/01/2010 17/01/2010 de 2
3 1 18/01/2010 20/01/2010 de 3

Note que o registro com HistoryID=3 tem o StartDate aumentado por 1 por causa do EndDate do registro precedente (6) é maior do que o StartDate do registro abaixo (3), que a escala era de 16/01/2010 a 20/01/2010.

The o mesmo comportamento deve aplicar-se se o usuário faz a uma atualização em qualquer registro em qualquer .

Following do campo (StartDate, EndDate, status) o resultset precedente, deixa a INSERÇÃO mais dados na identificação StartDate EndDate Status
6 1 de table.

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

INSERT EM

ResultSet do
VALUES da história (identificação, StartDate, EndDate, status) (1, “05/01/2010”, “10/01/2010”, 1) após a inserção: a identificação StartDate EndDate Status
6 1 do

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

Now o usuário muda o registro com HistoryID=3, com a ATUALIZAÇÃO folowing:
StartDate='17/01/2010', AJUSTADO EndDate='19/01/2010', Status=1
WHERE HistoryID=3

Resultset do
UPDATE: identificação StartDate EndDate Status
6 1 do

HistoryID 01/01/2010 04/01/2010 de 2
7 1 05/01/2010 10/01/2010 de 1
8 1 11/01/2010 16/01/2010 de 2
3 1 17/01/2010 19/01/2010 de 1
9 1 20/01/2010 20/01/2010 de INSERÇÃO de 3


Another:

INSERT no

Resultset do
VALUES da história (identificação, StartDate, EndDate, status) (1, “01/01/2010”, “18/01/2010”, 1): identificação StartDate EndDate Status
10 1 do

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

Note que os registros 7.8.3 estiveram suprimidos. O registro adicionado novo toma o EndDate modificado a 19/01/2010 por causa do EndDate do registro No. 3 teve o mesmo status, esse meios, que não há nenhuma necessidade de manter tampouco ou modificar o registro No. 3, para tomar apenas o EndDate dele e para põr o sobre o record.

I não saber conseguir este resultado junto com o comportamento expor aqui. Eu não sei se seu melhor fazê-lo como um disparador ou redigir um procedimento para introduzir registros e fazer todo o trabalho em it.

That´s ele. Se há toda a dúvida sobre as réguas, por favor, deixa-me know.

Thanks! considerações do

Best,

Marco André
class= do

Resposta : Como manter as datas de uma tabela da história alinhou sem aberturas?

olá! Marco,

O grande número de registros pode introduzir problemas de desempenho em ambas as encenações. O problema básico sobre o desempenho é sempre o mesmo: Testar todas as encenações e comparar os resultados.

Encontrar seu registro de história correto é simples:

SELECIONAR a PARTE SUPERIOR 1 * DE [HistoryTable] ONDE [a data] <>
Você pode usar uma função definida pelo utilizador do tabela-valor para calcular este registro, mas eu não posso supr sobre seu desempenho. Talvez há um fresco junta-se, mas eu não posso imaginar um agora;)

O usuário que múltiplo os problemas estão os mesmos em ambas as soluções, ele é o mesmo problema sobre a atomicidade que no problema conhecido de transferência da conta bancária. Você precisa um controle explícito da transação que encapsulating sua lógica e um nível da isolação de lido comete ou melhora.

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

-- com

CRIAR a FUNÇÃO [FindHistory]
    (
      @ID COMO O INT,
      @EVENTDATE COMO O DATETIME
    )
TABELA DOS RETORNOS
COMO
RETORNO
    (PARTE SUPERIOR SELETA 1
                H.*
            [HistoryTable] de H
      ONDE     H.ID = @ID
                E H. [HistoryDate] = @EventDate
      ORDEM  por H. [HistoryDate] DESC
    )
Outras soluções  
 
programming4us programming4us