Autor Zpráva
Ulet
Profil *
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"')
ale potřeboval bych s ním dále počítat, něco jako:
TO_CAHR(TO_CHAR(cas, 'HH24:"00"') - TO_CHAR(cas1, 'HH24:"30"'))
bohužel tohle funguje jen v případě že to napíšu jako:
TO_CAHR(TO_CHAR(cas, 'HH24:MI') - TO_CHAR(cas1, 'HH24:MI'))
jenže ty minuty potřebuji zadat sám a ne ty které jsou v databázi.
Díky
Kajman
Profil
Co přesně chcete udělat? Z těchto machinací to není úplně jasné.
Ulet
Profil *
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
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.

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: