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
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 ?] |