Autor Zpráva
Petr Ká
Profil
Ahoj,

potřeboval bych 2 konzultace, které se vztahují ke stejné DB struktuře.

Demonstrativně:

TABLE Předměty:
- id (AI), nazev

TABLE Předměty_časy
- id (AI), predmet_id, den (ENUM (Ponděli, Úterý ...)), od (TIME), do (TIME)

A) Jak spočítat celkový nevyužitý čas za celý týden?
B) Jak nejjednodušeji (složitost nevadí, jedná se o rychlost a nízkou náročnost na server) hlídat překryvy časů v tabulce Předměty_časy?
Na příklad: Předmět A bude v pondělí od 08:00 - 10:00 a předmět B by se zadal v pondělí od 09:00 - 11:30 (zde je hodinový překryv)

Mnohokrát díky
juriad
Profil
A) Celkový čas - využitý čas = Celkový čas - SELECT SUM(do-od) FROM Předměty_časy

B) Pokud by to MySQL uměla (neumí), tak je ideální CHECK. Ale naštěstí to jde nahradit TRIGGERem; pár odkazů:
http://stackoverflow.com/questions/14247655/mysql-check-constraint
http://stackoverflow.com/questions/9734920/can-a-mysql-trigger-simulate-a-check-constraint
http://blog.christosoft.de/2012/08/mysql-check-constraint/

Podmínku na překryv doufám znáš:
http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap
Petr Ká
Profil
juriad:
k bodu A) To mě také napadlo, ale třeba 08:00 - 07:00 vrátí 10000 ... Sloupce jsou typu TIME

B) Podívám se, díky, taky jsem myslel, že to bude trigerem
juriad
Profil
Petr Ká:
Aha, ty sloupce jsou TIME, tak takto: http://stackoverflow.com/questions/1329458/mysql-how-to-sum-times#2205509
Petr Ká
Profil
Takže, kdyby někdo řešil, tak řešení bodu A) je:

SELECT 
   SEC_TO_TIME(
      SUM(dta.a-dta.b)
   ) 
FROM (
   SELECT 
      SUM(60*60*24*7) AS a,
      SUM(TIME_TO_SEC(`od`)-TIME_TO_SEC(`do`)) AS b 
   FROM `predmety_casy` 
) dta

Snad to je správně :)

To omezení, až dořeším, tak sem taky hodím
juriad
Profil
A proč ne prostě takto (ten vnější dotaz není nutný, když ten vnitřní vrací jedinou řádku):
SELECT SEC_TO_TIME(60*60*24*7 - SUM(TIME_TO_SEC(`do`)-TIME_TO_SEC(`od`))) FROM `predmety_casy` 

Mimochodem, máš tam chybu v pořadí odečítání.

Oprava:
A stejně to nebude fungovat, protože SEC_TO_TIME převádí na interval 0:00:00 - 23:59:59. Asi se budeš muset smířit s výstupem v sekundách.
Petr Ká
Profil
juriad:
No na mysql verzi 5.5.38 mi to vrací např. 181:25:00, takže teoreticky by to mělo být ok...

Dodatek:
Nikdy se nestane, že čas přesáhne půlnoc

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: