Questione : Come effettuare le date di una tabella di storia ha allineato senza le lacune?

Ciao, il

I deve effettuare una tabella di storia, dove dato una nuova entrata o un'annotazione è aggiornata, la tabella è ricreata o allineata nuovamente (soltanto per le annotazioni con la stessa identificazione). Non ci dovrebbero essere lacune fra le annotazioni. Ogni annotazione ha uno StartDate e un EndDate. Sotto è lo schema della tabella: TABELLA del

CREATE [dbo]. [Storia] (IDENTITÀ del bigint del
[HistoryID] (1, 1) NON POSIZIONE DI SEGNALE MINIMO,
[identificazione] int NON NULLO, datetime del
[StartDate] NON NULLO, POSIZIONE DI SEGNALE MINIMO datetime del
[EndDate], POSIZIONE DI SEGNALE MINIMO del tinyint del
[condizione], CHIAVE PRIMARIA di VINCOLO del
[History_pk] RAGRUPPATA ([HistoryID]), il
GO

Here del
ON del
di VINCOLO del
[History_uq] ([identificazione], [StartDate])) è i dati del campione con le date state allineate: il

The DateFormat è identificazione StartDate EndDate Status
1 1 di dd/mm/yyyy

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

Rules: Il
1. si libera di tutte le file che sono interamente all'interno della gamma di nuova fila che è inserito o di updated.
example: il

INSERT nell'estremità ResultSet del

The del
VALUES (1, “01/01/2010„, “17/01/2010„, 2) di storia (identificazione, StartDate, EndDate, condizione) dovrebbe essere come segue: l'identificazione StartDate EndDate Status
6 1 del
HistoryID del
01/01/2010 17/01/2010 di 2
3 1 18/01/2010 20/01/2010 di 3

Note che l'annotazione con HistoryID=3 ha lo StartDate è aumentato di 1 a causa del EndDate del record precedente (6) è maggior di lo StartDate dell'annotazione sotto (3), che la gamma proveniva da 16/01/2010 a 20/01/2010.

The lo stesso comportamento dovrebbe applicarsi se l'utente rende ad un aggiornamento su qualunque annotazione su qualunque .

Following del campo (StartDate, EndDate, condizione) il resultset precedente, lascia l'INSERTO più dati nell'identificazione StartDate EndDate Status
6 1 di table.

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

INSERT nella storia (

ResultSet del
VALUES (1, “05/01/2010„, “10/01/2010„, 1) di identificazione, di StartDate, di EndDate, di condizione) dopo l'inserto: l'identificazione StartDate EndDate Status
6 1 del

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

Now l'utente cambia l'annotazione con HistoryID=3, con l'AGGIORNAMENTO folowing:
StartDate='17/01/2010', STABILITO EndDate='19/01/2010', Status=1
WHERE HistoryID=3

Resultset del
UPDATE: identificazione StartDate EndDate Status
6 1 del

HistoryID 01/01/2010 04/01/2010 di 2
7 1 05/01/2010 10/01/2010 di 1
8 1 11/01/2010 16/01/2010 di 2
3 1 17/01/2010 19/01/2010 di 1
9 1 20/01/2010 20/01/2010 di INSERTO di 3


Another:

INSERT nel

Resultset del
VALUES (1, “01/01/2010„, “18/01/2010„, 1) di storia (identificazione, StartDate, EndDate, condizione): identificazione StartDate EndDate Status
10 1 del

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

Note che le annotazioni 7.8.3 sono state cancellate. La nuova annotazione aggiunta prende il EndDate modificato a 19/01/2010 a causa del EndDate dell'annotazione no 3 ha avuta la stessa condizione, quella mezzi, che non ci è necessità di mantenere o modificare l'annotazione no 3 neanche, per prenderle appena il EndDate e metterlo sul record.

I non sapere raggiungere questo risultato insieme al comportamento esposto qui. Non so se il relativo migliore farlo come innesco o redigere una procedura per l'inserimento delle annotazioni e fare tutto il lavoro in it.

That´s esso. Se ci è tutto il dubbio circa le regole, lascialo prego know.

Thanks! riguardi del

Best,

Marco André
class= del

Risposta : Come effettuare le date di una tabella di storia ha allineato senza le lacune?

ciao Marco,

Il gran numero delle annotazioni può introdurre i problemi di rendimento in entrambi i piani d'azione. Il problema di base circa la prestazione è sempre lo stesso: Verificare tutti i piani d'azione e confrontare i risultati.

L'individuazione della vostra annotazione di storia corretta è semplice:

SELEZIONARE il PRINCIPALE 1 * DA [HistoryTable] DOVE [data] <>
Potete usare una funzione prestabilita dall'utente di tabella-valore per calcolare questa annotazione, ma non posso indovinare circa la relativa prestazione. Forse ci è un freddo si unisce, ma non posso immaginare uno ora;)

L'utente che multiplo i problemi sono gli stessi in entrambe le soluzioni, esso è lo stesso problema circa atomicità di nel problema ben noto di trasferimento di conto bancario. Avete bisogno di un controllo esplicito di transazione che incapsula la vostra logica e un livello di isolamento di colto di commette o migliora.

mfG
--> Stefan <-->
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
SELEZIONARE  *
    [EventTable] dalla E
        LA TRAVERSA SI APPLICA [dbo]. [FindHistory] (E. [identificazione], E. [EventDate]) H;

-- con

GENERARE la FUNZIONE [FindHistory]
    (
      @ID COME INT,
      @EVENTDATE COME DATETIME
    )
TABELLA DI RITORNI
AS
RITORNO
    (PRINCIPALE PRESCELTO 1
                H.*
            [HistoryTable] dalla H
      DOVE     H.ID = @ID
                E H. [HistoryDate] = @EventDate
      ORDINE  dal H. [HistoryDate] DESC
    )
Altre soluzioni  
 
programming4us programming4us