Skip site navigation (1) Skip section navigation (2)

Re: Comptabiliser des heures

From: Jean-Paul ARGUDO <jean-paul(at)argudo(dot)org>
To: Remi <remi_simsa(at)yahoo(dot)es>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Comptabiliser des heures
Date: 2004-11-17 22:14:56
Message-ID: 20041117221456.GA17516@maison.argudo.org (view raw or flat)
Thread:
Lists: pgsql-fr-generale
Humm...

Je pense qu'il doit y avoir plus sexy que ma solution... Elle a juste le mérite
de faire travailler un peu PostgreSQL...

Par contre, je suis *certain* qu'on doit pouvoir faire bien mieux, en réduisant
au minimum mes conversions date->texte et texte->date.

J'utilise ci-après une petite ruse: en tranformant un timestamp en texte puis
date, en ne me souciant que de YYYYMMDD, je m'économise l'écriture du
"minuit"... :

-------->%--------------
drop table pointeuse;

create table pointeuse (
        id integer,
        employe integer,
        date_entree timestamp,
        date_sortie timestamp
        );

insert into pointeuse values (1,1,'2004-11-11 22:00','2004-11-12 02:00');
insert into pointeuse values (2,1,'2004-11-13 08:00','2004-11-13 18:00');
insert into pointeuse values (3,1,'2004-11-14 08:00','2004-11-14 16:00');
insert into pointeuse values (4,1,'2004-11-15 15:00',null);

select * from pointeuse;

select date_sortie-date_entree as heures_travaillees_bugs from pointeuse;

select to_char(date_entree,'DD/MM/YYYY') as jour,date_sortie-date_entree as
heures_travaillees
from pointeuse
where to_char(date_entree,'YYYYMMDD')=to_char(date_sortie,'YYYYMMDD')
union
select
to_char(date_sortie,'DD/MM/YYYY'),date_sortie-to_date(to_char(date_sortie,'YYYYMMDD'),'YYYYMMDD')
from pointeuse
where to_char(date_entree,'YYYYMMDD')=to_char(date_sortie-interval '1
day','YYYYMMDD')
union
select
to_char(date_entree,'DD/MM/YYYY'),to_date(to_char(date_sortie,'YYYYMMDD'),'YYYYMMDD')-date_entree
from pointeuse
where to_char(date_entree+interval '1
day','YYYYMMDD')=to_char(date_sortie,'YYYYMMDD')

-------->%--------------

psql <tabase> < mon_script_ci_dessus

donne:

DROP TABLE
CREATE TABLE
INSERT 2163047 1
INSERT 2163048 1
INSERT 2163049 1
INSERT 2163050 1
 id | employe |     date_entree     |     date_sortie
----+---------+---------------------+---------------------
  1 |       1 | 2004-11-11 22:00:00 | 2004-11-12 02:00:00
  2 |       1 | 2004-11-13 08:00:00 | 2004-11-13 18:00:00
  3 |       1 | 2004-11-14 08:00:00 | 2004-11-14 16:00:00
  4 |       1 | 2004-11-15 15:00:00 |
(4 rows)

 travail
----------
 04:00:00
 10:00:00
 08:00:00

(4 rows)

    jour    | heures_travaillees
------------+--------------------
 11/11/2004 | 02:00:00
 12/11/2004 | 02:00:00
 13/11/2004 | 10:00:00
 14/11/2004 | 08:00:00
(4 rows)
----------------------------------------------

Ne te réjouis pas trop vite... Cette solution comporte un cas limite qui ne
marchera pas:

=> Si par malheur ton employé s'endort sur sa chaise et passe plus de deux jours
d'affilée à son poste, ma solution ne marchera pas :-)

Exemple:

insert into pointeuse values (1,1,'2004-11-09 08:00','2004-11-11 09:00');

et relance....


-- 
Jean-Paul ARGUDO

 Site perso : http://www.argudo.org
 PostgreSQL : http://www.postgresqlfr.org
 l'APRIL    : http://www.april.org

In response to

Responses

pgsql-fr-generale by date

Next:From: Laurent MesuréDate: 2004-11-18 22:16:41
Subject: Re: Comptabiliser des heures
Previous:From: Guillaume LELARGEDate: 2004-11-17 21:05:22
Subject: Re: [Fwd: Re: Why PostgreSQL ?]

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group