Zkouším to z hlavy a pro MSSQL (bez funkčních vychytávek - s nimi bych to udělal trochu jednodušeji, ale v MySQL nejsou):
-- přijímám parametr @posun, který určuje v minutách o kolik posunou a @posunId určuje Id položky od které posunovat
declare @casZahajeni datetime
declare @casUkonceni datetime
-- najit cas zacatku
select
@casZahajeni = [cas_zahajeni],
@casUkonceni = [cas_ukonceni]
from [tab]
where
[id] = @posunId
-- posunovat @casUkonceni tak dlouho, nez najdeme mezeru alespon "@posun" minut nebo konec seznamu
declare @casZahajeniDalsi datetime
declare @casUkonceniDalsi datetime
set @casZahajeniDalsi = @casUkonceni -- prvni hledani od aktualne znameho konce
while DATEDIFF(minute, @casUkonceni, @casZahajeniDalsi) < @posun -- pokud dorazime na konec nebo bude cas vetsi, pouzije se aktualne konec prohledavani @casUkonceni
begin
set @casUkonceni = @casUkonceniDalsi
select top 1
@casZahajeniDalsi = [cas_zahajeni],
@casUkonceniDalsi = [cas_ukonceni]
from [tab]
where
[cas_zahajeni] >= @casUkonceni
order by
[cas_zahajeni]
end
-- posunout
update [tab] set
[cas_zahajeni] = DATEADD(minute, [cas_zahajeni], @posun),
[cas_ukonceni] = DATEADD(minute, [cas_ukonceni], @posun)
where
[cas_zahajeni] >= @casPocatek
and [cas_zahajeni] <= @casUkonceni
Btw doporučuju na [cas_zahajeni] udělat index. Určitě to nebude jediná operace, u které se to vyplatí. Snad je to bez chyby, myšlenka je z toho doufám patrná.
|