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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-fr-generale by date

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