Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
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
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 !
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 et en plus j'ai ma durée en français !
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
Hors ligne
Pages : 1