Autor | Zpráva | ||
---|---|---|---|
Ulet Profil * |
#1 · Zasláno: 8. 2. 2012, 12:50:13
Zdravím s oracle opravdu začínám takže tahle otázka asi nebude velký problém nicméně řeším jak správně napsat toto:
když použiji tento zápis normálně se mi čas vypíše: TO_CHAR(cas, 'HH24:"00"') TO_CAHR(TO_CHAR(cas, 'HH24:"00"') - TO_CHAR(cas1, 'HH24:"30"')) TO_CAHR(TO_CHAR(cas, 'HH24:MI') - TO_CHAR(cas1, 'HH24:MI')) Díky |
||
Kajman Profil |
#2 · Zasláno: 8. 2. 2012, 13:22:42
Co přesně chcete udělat? Z těchto machinací to není úplně jasné.
|
||
Ulet Profil * |
#3 · Zasláno: 8. 2. 2012, 13:27:37 · Upravil/a: Ulet
No potřebuji zaokrouhlit čas v určitých případech na pulhodiny a v dalších na celé dle toho kdy pracovník dojde do práce (tohle už jsem si vyřešil). Protože v databázi se ukládá přesný čas příchodu/odchodu. A z rozdílu zaokrouhlených časů je potřeba udělat počet hodin v práci.
Příklad: reálně v databázi: příchod 9:03 odchod 16:41 po zaokrouhlení: příchod: 9:00 odchod: 16:30 celkem odpracováno 7:30 |
||
Kajman Profil |
Snad by to šlo takto nějak...
select ( (trunc(odchod, 'HH24') + round((odchod - trunc(odchod, 'HH24')) * 48) / 48) -round(prichod, 'HH24') ) * 24 hodin from (select to_date('8.2.2012 09:03', 'DD.MM.YYYY HH24:MI') prichod, to_date('8.2.2012 16:41', 'DD.MM.YYYY HH24:MI') odchod from dual) t S tím, že kdyby se nemělo zaokrouhlovat aritmeticky, ale vždy dolů, tak použijete místo round také trunc. |
||
Ulet Profil * |
Jop bohuzel ja jsem v tomhle fakt zacatecnik a popravde ten dotaz cos napsal uplne nechapu, ono je to cele trosku slozitejsi vsichni zamestnanci musi chodit 10 minut pred zacatekem a odchztet 10 minut po nem. (pocitani po pul hodine). Bude to asi priserne ale takto vypada cely dotaz:
SELECT mitarbeiter.NAME1 AS jmeno, TO_CHAR (prodaufarbist.belegdat, 'DD-MM-YYYY') AS datum, TO_CHAR(prodaufarbist.STARTZEIT, 'HH24:MI') as prichod_cas, (case when (TO_CHAR (prodaufarbist.STARTZEIT, 'MI')) <= 20 then TO_CHAR (prodaufarbist.STARTZEIT, 'HH24:"00"') when (TO_CHAR (prodaufarbist.STARTZEIT, 'MI')) BETWEEN 20 AND 50 then TO_CHAR (prodaufarbist.STARTZEIT, 'HH24:"30"') when (TO_CHAR (prodaufarbist.STARTZEIT, 'MI')) > 50 then to_char (prodaufarbist.STARTZEIT+1/24, 'HH24:"00"') end) as prichod_pocitany, TO_CHAR (prodaufarbist.ENDEZEIT, 'HH24:MI') AS odchod_cas, (case when (TO_CHAR (prodaufarbist.ENDEZEIT, 'MI')) <= 10 then (case when TO_CHAR (prodaufarbist.ENDEZEIT-1/48, 'MI') BETWEEN 0 AND 10 then TO_CHAR (prodaufarbist.ENDEZEIT-1/48, 'HH24:"00"') when TO_CHAR (prodaufarbist.ENDEZEIT-1/48, 'MI') > 10 then TO_CHAR (prodaufarbist.ENDEZEIT-1/48, 'HH24:"30"') end) when (TO_CHAR (prodaufarbist.ENDEZEIT, 'MI')) BETWEEN 10 AND 40 then TO_CHAR (prodaufarbist.ENDEZEIT, 'HH24:"00"') when (TO_CHAR (prodaufarbist.ENDEZEIT, 'MI')) > 40 then TO_CHAR (prodaufarbist.ENDEZEIT, 'HH24:"30"') end) as odchod_pocitany, ((prodaufarbist.ENDEZEIT-prodaufarbist.STARTZEIT)*24) AS odpracovano_hod -- sum(case when ((prodaufarbist.ENDEZEIT-prodaufarbist.STARTZEIT)*24)=0 then 0 else ((prodaufarbist.ENDEZEIT-prodaufarbist.STARTZEIT)*24) end) as odpracovano_celkem_hod FROM mitarbeiter, produktion, prodaufarbist WHERE prodaufarbist.MARBNR = mitarbeiter.MITARBNR AND prodaufarbist.PRDAUFNR = produktion.LFDNR AND produktion.AUFART = 101 AND mitarbeiter.login = 'VISTRJ' AND belegdat BETWEEN '1.4.2011' AND '30.4.2011' --GROUP BY mitarbeiter.NAME1 ORDER BY mitarbeiter.NAME1 ASC; vlastne vse co potrebuju me to vypisuje spravne jen z toho nedokazu dostat rozdil casu u PRICHOD_POCITANY a ODCHOD_POCITANY konkretne mu vadi ty dvojite uvozovky u "zaokrouhlovani" (prodaufarbist.STARTZEIT, 'HH24:"00"') tohle je spatny zapis (prodaufarbist.STARTZEIT, 'HH24:MI') takhle to zezere a rozdil by spocital ale zase nemam ten cas zaokrouhleny (takze me to vraci s problemem uuplne na zacatek :-D). jo ty poznamky za -- tam ted nemaji bejt to az to bude pocitat pro vsechny zamestnance fungovalo me to tak dokud nezacalo to pravidlo s 10min. |
||
Kajman Profil |
#6 · Zasláno: 8. 2. 2012, 14:52:54
Zaokrouhlení na celé hodiny je na řádku 3, zaokrouhlení na půlhodiny je na řádku 2 (to je složitější). Deset minut je 1/144, to můžete k těm sloupcům jednoduše přičíst či odečíst, před tím zaokrouhlením.
Nevím, kde jste došel k tomu, že by v oracle to_char podporovala nějaké dvojité úvozovky. Jinak můžete použít operátor || na spojení řetězců, pokud trváte na práci s řetězci. |
||
Časová prodleva: 12 let
|
0