Řazení časů   zodpovězená otázka

SQL, Databáze

Tento dotaz směřuje na systém MySQL.

Dobrý den,

situace:v tabulce uložené cas_ukonceni, cas_zahajeni a id_predmetu, potřebuji posouvat čas ukončení aktuálního předmětu, a všech následujících v jedné řadě. Takže by mi de facto stačilo seřadit časy a najít první mezeru delší než řekněme 10 minut a všechny následující časy posunout. Ideální by bylo seřazený výpis procházet a porovnávat dva sousední prvky(aktuální a následující) id ale nemusí odpovídat pořadí. Řešením by snad mohlo být vytvoření seřazeného a oindexovaného pohledu, ale nejde to jednodušeji?

S pozdravem Seth

nahlásit spamnahlásit spam 0 odpovědětodpovědět

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á.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback