Autor | Zpráva | ||
---|---|---|---|
Petr Ká Profil |
#1 · Zasláno: 24. 9. 2014, 12:00:23
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 |
#3 · Zasláno: 24. 9. 2014, 12:20:53
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 |
#4 · Zasláno: 24. 9. 2014, 12:29:58
Petr Ká:
Aha, ty sloupce jsou TIME, tak takto: http://stackoverflow.com/questions/1329458/mysql-how-to-sum-times#2205509 |
||
Petr Ká Profil |
#5 · Zasláno: 24. 9. 2014, 14:00:16
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 |
#7 · Zasláno: 24. 9. 2014, 15:12:02
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 |
||
Časová prodleva: 10 let
|
0