Vous n'êtes pas identifié(e).

#1 23/03/2020 16:54:08

Olivier MAMDY
Membre

Agrégat sur des intervals

Bonjour à tous
Je cherche à calculer sur une période, le temps d’indisponibilité d'engins, en faisant la somme des durées d'indisponibilité (agrégat);
La durée d'indisponibilité est calculée avec avec  la date de fin arret -  la date de début d'arret  (les 2 champs sont au format timestamp)
voici mon code sql

 SELECT arret.id_bacs, 
	EXTRACT(YEAR FROM arret.date_debut_arret) AS Année, 
	EXTRACT(MONTH FROM arret.date_debut_arret) AS Mois,
    count(arret.id_arret) AS nbreArret, 
    sum(arret.date_fin_arret -  arret.date_debut_arret) as Duree,
    ta.arret_cause
   FROM arret, type_arret ta
  WHERE arret.id_type_arret = ta.id_type_arret and arret.id_bacs = 2
  GROUP BY arret.id_bacs, année,mois,ta.arret_cause
  ORDER BY arret.id_bacs,année desc;

la requête fonctionne, mais j'ai certains résultats pour ma durée qui apparaissent comme ceci:  7 days 33:30:10 ... la somme s'effectue bien , mais on constate que les heures n'ont pas été transformées en  jours ... le bon résultats aurait dû être : 8 days 09:30:10 Non ?

PS ... Peut-on transformer le résultat en français ? 7 jours 09:30:10

Hors ligne

#2 23/03/2020 17:30:04

pifor
Membre

Re : Agrégat sur des intervals

Je n'arrive pas à reproduire le résultat ni avec PG 12.2 ni avec PG 9.4.26:

postgres=# select '23-03-2020 16:00'::timestamp - '15-03-2020 06:30'::timestamp;
    ?column?     
-----------------
 8 days 09:30:00
(1 ligne)

Que donne le résultat de ma requête dans votre environnement ?
Quelle est votre version ?


Je n'arrive pas non plus à passer en français même avec le paramétrage suivant:

postgres=# set datestyle to 'DMY';
SET
postgres=# set lc_messages='fr_FR.UTF-8';
SET
postgres=# set lc_time='fr_FR.UTF-8';
SET
postgres=# select '23-03-2020 16:00'::timestamp - '15-03-2020 06:30'::timestamp;
    ?column?     
-----------------
 8 days 09:30:00
(1 ligne)

postgres=# 

Dernière modification par pifor (23/03/2020 17:39:48)


Pierre

Hors ligne

#3 23/03/2020 17:34:28

Olivier MAMDY
Membre

Re : Agrégat sur des intervals

Bonjour et merci pour votre réponse rapide  wink
la requête fonctionne bien, mais ce n'est pas une requête avec un agrégat (sum) , comme dans mon exemple ...

Hors ligne

#4 23/03/2020 17:38:34

pifor
Membre

Re : Agrégat sur des intervals

Essayez avec JUSTIFY_HOURS:

postgres=# select ('23-03-2020 16:00'::timestamp - '19-03-2020 06:30'::timestamp) +
postgres-# ('19-03-2020 06:29'::timestamp - '15-03-2020 06:30'::timestamp);
    ?column?     
-----------------
 7 days 33:29:00
(1 ligne)
postgres=# select justify_hours(('23-03-2020 16:00'::timestamp - '19-03-2020 06:30'::timestamp) +
('19-03-2020 06:29'::timestamp - '15-03-2020 06:30'::timestamp));
  justify_hours  
-----------------
 8 days 09:29:00
(1 ligne)

postgres=# 

Pierre

Hors ligne

#5 23/03/2020 17:39:39

gleu
Administrateur

Re : Agrégat sur des intervals

Le fait qu'il n'y ait pas d'agrégat ne change rien en soi. En en ajoutant un, le résultat est le même :

postgres=# select sum('2020-3-23 16:00'::timestamp - '2020-03-15 06:30'::timestamp);
┌─────────────────┐
│       sum       │
├─────────────────┤
│ 8 days 09:30:00 │
└─────────────────┘
(1 row)

Concernant l'affichage en anglais, il n'est pas possible de le changer. À ma connaissance, un type interval sera toujours affiché en anglais.

Pour en revenir à votre premier problème, êtes vous capable de fournir un exemple complet montrant le problème ?


Guillaume.

Hors ligne

#6 23/03/2020 17:41:47

gleu
Administrateur

Re : Agrégat sur des intervals

Bien vu pour le justify_hours smile


Guillaume.

Hors ligne

#7 23/03/2020 17:45:30

Olivier MAMDY
Membre

Re : Agrégat sur des intervals

Super ! merci beaucoup ! Ca fait depuis ce matin que je cherche ! smile
Portez vous bien !

Hors ligne

#8 23/03/2020 17:50:33

Olivier MAMDY
Membre

Re : Agrégat sur des intervals

Encore un petite question est ce qu'on peut avoir la durée sous forme de d'année, mois , jour heure minute ?
exemple 0 year 3 month 12 days 02:30:10

Hors ligne

#9 23/03/2020 18:16:16

Olivier MAMDY
Membre

Re : Agrégat sur des intervals

je me réponds ...
Pour avoir les mois , j'ai remplacé Justify_hours par justify_interval  et j'ai rajouté un to_char pour avoir ma durée en mois, jours etc ...
Qu'en pensez vous ?

select to_char(justify_interval( ('23-03-2020 16:00'::timestamp - '19-01-2020 06:30'::timestamp) +
 ('19-03-2020 06:29'::timestamp - '15-01-2020 06:30'::timestamp)),'mm "mois" DD "jour(s)" HH "heure(s)" MI "min"' );

Ca à l'air d'être correct smile et en plus j'ai ma durée en français ! smile

Hors ligne

#10 23/03/2020 18:39:33

pifor
Membre

Re : Agrégat sur des intervals

Pas mieux:

set datestyle='dmy';
SET
with cte as
( 
 select justify_interval(('23-03-2020 16:00'::timestamp - '19-01-2020 06:30'::timestamp) 
                       + ('19-03-2020 06:30'::timestamp - '15-01-2020 06:30'::timestamp))
 as intervalle 
)
select 
extract(year from intervalle)      || ' an(s) '    ||
extract(month from intervalle)     || ' mois(s) '  || 
extract(days from intervalle)      || ' jours(s) ' || 
extract(hours from intervalle)	   || ':'          || 
extract(minutes from intervalle) as durée
from cte;
               durée               
-----------------------------------
 0 an(s) 4 mois(s) 8 jours(s) 9:30
(1 ligne)

select 
to_char(justify_interval( ('23-03-2020 16:00'::timestamp - '19-01-2020 06:30'::timestamp)
+                         ('19-03-2020 06:29'::timestamp - '15-01-2020 06:30'::timestamp)),
'y "ans" mm "mois" DD "jour(s)" HH "heure(s)" MI "min"' ) as durée;
                    durée                    
---------------------------------------------
 0 ans 04 mois 08 jour(s) 09 heure(s) 29 min
(1 ligne)

Pierre

Hors ligne

#11 24/03/2020 09:25:10

Olivier MAMDY
Membre

Re : Agrégat sur des intervals

Il faut ajouter HH24 sinon...  pour une durée de 00:21:07
- avec HH  on obtient                                           0 mois 00 jours 12 heures 21 min 07 sec
- avec HH24 on obtient la bonne transcription :      0 mois 00 jours 00 heures 21 min 07 sec

Encore merci pour vos retours smile

Hors ligne

Pied de page des forums