Autor Zpráva
Gogo_v
Profil *
Dobrý den. Potřeboval bych pomoci se selectem z databaze. Mám dva sloupce time_od a time_do. v tabulce jsou uložené jako TIME.
Výsledek by měl být počet hodin v rozsahu 7-19 a 19-7 zatim jsem vypotil [vygooglil] neco takovéhoto. funguje to relativně dle očekávání problem ale je když čas začíná např. v 18:30 a končí v 20:30 výsledek se mi vrátí v rozsahu 7 - 19 což je ale špatně :( stejný problém pochopitelně když začíná v 6:00 a končí v 8:00 zase to vrátí v rozsdahu 19-7

"select sec_to_time(sum(time_to_sec(timediff(time_do, time_od)))) from pohotovost_vyjezd where prubehid=$id AND HOUR(time_od) BETWEEN 7 AND 19 group by id with rollup;"

"select sec_to_time(sum(time_to_sec(timediff(time_do, time_od)))) from pohotovost_vyjezd where prubehid=$id AND HOUR(time_od) NOT BETWEEN 7 AND 19 group by id with rollup;"


Diky moc za pomoc.
Tori
Profil
Šlo by to určitě udělat podmínkou, ale asi to bude pomalé.
TIMEDIFF( IF(time_do > '19:00', '19:00:00', time_do), IF(time_od < '07:00', '07:00:00', time_od))
Gogo_v
Profil *
Tori:
o rychlost moc nejde jedná se o pár záznamu řekněme 50 za měsíc ta podminka ale asi neřesí co potřebuju. Jedná se mi o to že mám v tabulce uložené dny a k nim dvě pole plnění úkolu od-do a potřebuju počet hodin každý den v těch dvou kategoriich tj kolik hodin se plnili nějaké úkoly jedna se mi vyloženě o sumu např. 23,5 hodin od 7-19 a 10 hodin od 19-7 konkrétní den. Nevím jestli jsem to napsal srozumitelně :)
+----+----------+----------+----------+-----------------------------+
| id | prubehid | time_od  | time_do  | ukol                         |
+----+----------+----------+----------+-----------------------------+
|  1 |       16 | 10:00:00 | 11:00:00 | Delal jsem neco nevim co :) |
|  2 |       16 | 12:00:00 | 13:00:00 | dalsi vyjezd                |
|  7 |        7 | 22:00:00 | 23:20:00 | pokus 123                   |
|  4 |       42 | 10:00:00 | 12:00:00 | nevim co                    |
|  6 |       16 | 18:20:00 | 19:20:00 | pres 19 hodinu              |
+----+----------+----------+----------+-----------------------------+
kde prubehid je index dne ve druhe tabulce která definuje dny a další nepodstatné věci.
Tori
Profil
Gogo_v:
U intervalu 18:00-20:00 počítáte hodinu do denní směny a hodinu do noční, chápu správně? Ve [#2] jsem vycházela z tohoto předpokladu (patří to místo toho timediff(time_od, time_do), aby se u přesahujících intervalů nepočítala ta část v jiné směně).
Zkoušela jsem počítat ty noční časy, ale nejde to jen obrácením porovnávání, omlouvám se za nedomyšlenou radu.
Gogo_v
Profil *
Tori:
Tak uplně nedomyšlené to neni jde to udělat ale musel bych ten select pustit třikrat a výsledek pak sečíst ... určitě to jde jednodušeji jen nevim jak
select sec_to_time(sum(time_to_sec(TIMEDIFF( IF(time_do < '19:00', '19:00:00', time_do), IF(time_od < '19:00', '19:00:00', time_od))))) from pohotovost_vyjezd where prubehid=16 AND HOUR(time_od) BETWEEN 7 AND 19 group by id with rollup;
Kajman_
Profil *
select id,
       -- sum(time_to_sec(timediff(time_do,time_od)))/3600 vse,
       sum(time_to_sec(timediff(least(time_do,'19:00'),greatest(time_od,'07:00'))))/3600 den, 
       sum(time_to_sec(timediff(greatest(time_do,'19:00'),greatest(time_od,'19:00'))))/3600
       +
       sum(time_to_sec(timediff(least(time_do,'07:00'),least(time_od,'07:00'))))/3600 noc
from   pohotovost_vyjezd v
where  prubehid=16
group  by id with rollup
Gogo_v
Profil *
Kajman,
To nevypada zle ovšem ma to jednu mouchu
+----+--------+---------+--------+
| id | vse    | den     | noc    |
+----+--------+---------+--------+
|  1 | 1.0000 |  1.0000 | 0.0000 |
|  2 | 1.0000 |  1.0000 | 0.0000 |
|  6 | 1.0000 |  0.6667 | 0.3333 |
|  8 | 2.3333 | -2.0000 | 2.3333 |
| NULL | 5.3333 |  0.6667 | 2.6667 |
+----+--------+---------+--------+
správně by mělo vrátit den = 2,66 noc = 2.6667 odečítá to -2 když je noční událost která nepřesahuje do denní periody

tabulka na kterou jsem zkoušel ten select
+----+----------+----------+----------+-----------------------------+
| id | prubehid | time_od  | time_do  | vyjezd                      |
+----+----------+----------+----------+-----------------------------+
|  1 |       16 | 10:00:00 | 11:00:00 | Delal jsem neco nevim co :) |
|  2 |       16 | 12:00:00 | 13:00:00 | dalsi vyjezd                |
|  6 |       16 | 18:20:00 | 19:20:00 | pres 19 hodinu              |
|  8 |       16 | 21:00:00 | 23:20:00 | nocni                       |
+----+----------+----------+----------+-----------------------------+
Kajman_
Profil *
tak zkuste, tuhle to
sum(time_to_sec(timediff(least(greatest(time_do,'07:00'),'19:00'),least(greatest(time_od,'07:00'),'19:00'))))/3600 den, 
Gogo_v
Profil *
Kajman:
Ano, s timto to funguje perfektně díky moc za pomoc.

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:

0