Pytanie : Dlaczego the data historia stół wyrównywać bez przerwa?

Cześć,

I musieć historia stół, dokąd nowy wejście lub rejestr aktualizować, the stół odtwarzać lub realigned (tylko dla rejestr z the ten sam ID). Tam  musieć żadny przerwa między the rejestr. EndDate rejestr mieć StartDate i EndDate. Pod być the schemat the stół:

CREATE STÓŁ [dbo]. [Historia] (
[HistoryID] bigint TOŻSAMOŚĆ ((1), 1) NIEOBOWIĄZUJĄCY,
[ID] int NIEOBOWIĄZUJĄCY,
[StartDate] datetime NIEOBOWIĄZUJĄCY,
[EndDate] nieobowiązujący NIEOBOWIĄZUJĄCY,
[Status] tinyint NIEOBOWIĄZUJĄCY,
PRZYMUS [History_pk] PRASMOŁA KLUCZ GROMADZIĆ SIĘ ([HistoryID]),
PRZYMUS [History_uq] UNIKALNY ([ID], [StartDate])
)
ON [PRASMOŁA]
GO

Here być próbka dane z the data wyrównywać:

The DateFormat być dd/mm/yyyy

HistoryID ID StartDate EndDate Status
1 (1) 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:
1.Get pozbywać się jakaś rząd który być zupełnie wśród the pasmo the nowy rząd lub updated.
example:

INSERT W Historia (ID, StartDate, EndDate, Status)
VALUES ((1), "01/01/2010", "17/01/2010", 2)

The końcówka ResultSet musieć podążać:

HistoryID ID StartDate EndDate Status
6 (1) 01/01/2010 17/01/2010 2
3 (1) 18/01/2010 20/01/2010 3

Note że the rejestr z HistoryID=3 mieć the StartDate wzrastać (1) przez the EndDate the poprzedzający dokumentacyjny (6) być większy niż the StartDate the rejestr pod (3), che pasmo być od 16/01/2010 20/01/2010.

The ten sam zachowanie musieć jeżeli the użytkownik robić aktualizacja na jakaś rejestr na jakaś śródpolny (StartDate, EndDate, Status) .

Following the poprzedzający resultset, pozwalać WSZYWKA więcej dane w the table.

HistoryID ID StartDate EndDate Status
6 (1) 01/01/2010 17/01/2010 2
3 (1) 18/01/2010 20/01/2010 3

INSERT W Historia (ID, StartDate, EndDate, Status)
VALUES ((1), "05/01/2010", "10/01/2010", 1)

ResultSet po the wszywka:

HistoryID ID StartDate EndDate Status
6 (1) 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 the użytkownik zmieniać the rejestr z HistoryID=3, z the folowing AKTUALIZACJA:
UPDATE
USTALONY StartDate='17/01/2010', EndDate='19/01/2010', Status=1
WHERE HistoryID=3

Resultset:

HistoryID ID StartDate EndDate Status
6 (1) 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 3


Another WSZYWKA:

INSERT W Historia (ID, StartDate, EndDate, Status)
VALUES ((1), "01/01/2010", "18/01/2010", 1)

Resultset:

HistoryID ID StartDate EndDate Status
10 (1) 01/01/2010 19/01/2010 1
9 (1) 20/01/2010 20/01/2010 3

Note że the rejestr 7,8,3 kasować. The nowy dodawać rejestr brać the EndDate modyfikować 19/01/2010 przez the EndDate rejestr nie 3 miewać the ten sam status, 3 środek, że tam  być żadny potrzeba lub the rejestr nie 3 także, właśnie brać the EndDate ono i stawiać ono na the niedawno wkładać record.

I znać dlaczego ten rezultat wraz z the zachowanie wystawiać tutaj. I znać jeżeli swój lepszy ono jako cyngiel lub procedura dla rejestr i wszystkie the praca w it.

That´s ono. Jeżeli tam  być jakaś wątpliwość o the reguła, zadawalać, pozwalać know.

Thanks!

Best Uwzględnienie,

Marco André

Odpowiedź : Dlaczego the data historia stół wyrównywać bez przerwa?

cześć Marco,

The ogromna liczba rejestr móc występ problem w oba scenariusz. The podstawowy problem o występ być zawsze the być: Badać wszystkie scenariusz i porównywać the rezultat.

Twój poprawny historia rejestr być prosty:

WYBRANY WIERZCHOŁEK (1) * OD [HistoryTable] DOKĄD [Data] <>
Ty móc użytkownik - definiować zgłaszać-cenić funkcja ten rejestr, ale I móc o swój występ. Być może tam  być chłodno łączyć, ale I móc jeden teraz;)

The wieloskładnikowy użytkownik problem być the być w oba rozwiązanie, ono być the ten sam problem o atomicity w the słynny konto bankowe przeniesienie problem. Ty potrzebować wyraźny transakcja kontrola twój logika i odosobnienie równy read popełniać lub polepszać.

mfG
--> stefan <-->
(1):
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
WYBIÓRKA  *
OD    [EventTable] E
        KRZYŻ STOSOWAĆ [dbo]. [FindHistory] (E. [ID], E. [EventDate]) H;

-- z

TWORZYĆ FUNKCJA [FindHistory]
    (
      @ID JAKO INT,
      @EVENTDATE DATETIME
    )
POWRÓT STÓŁ

POWRÓT
    (WYBRANY WIERZCHOŁEK (1)
                H.*
      OD      [HistoryTable] H
      DOKĄD     H.ID = @ID
                I H. [HistoryDate] = @EventDate
      ROZKAZ  H. [HistoryDate] DESC
    )
Inne rozwiązania  
 
programming4us programming4us