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

#1 28/05/2013 11:34:26

Type pour un intervalle de temps

Bonjour,

Je me demande si le type interval est adapté pour noter un intervalle de temps. Ce qui m'interroge avec ce type, c'est la précision à 1 microseconde... inutile pour moi.

Concrètement, je dois stocker dans ma base de données des durées d'intervention, donc des informations du type : 15 minutes, 1,5 heures, etc. Les durées n'excèdent pas la journée.

Merci pour vos avis et bonne journée !

Thomas

Hors ligne

#2 28/05/2013 12:15:31

kenrio
Membre

Re : Type pour un intervalle de temps

de la doc :

The interval type has an additional option, which is to restrict the set of stored fields by writing one of these phrases:

YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
YEAR TO MONTH
DAY TO HOUR
DAY TO MINUTE
DAY TO SECOND
HOUR TO MINUTE
HOUR TO SECOND
MINUTE TO SECOND

en espérant que ça soit la réponse

Dernière modification par kenrio (28/05/2013 12:16:00)

Hors ligne

#3 28/05/2013 13:35:56

gleu
Administrateur

Re : Type pour un intervalle de temps

interval est le seul type de données pour ce genre de données.


Guillaume.

Hors ligne

#4 28/05/2013 13:36:33

gleu
Administrateur

Re : Type pour un intervalle de temps

Un petit exemple d'utilisation :

postgres=# create table toto(c1 interval);
CREATE TABLE
postgres=# insert into toto values ('15 minutes');
INSERT 0 1
postgres=# select * from toto;
    c1    
----------
 00:15:00
(1 row)

postgres=# select now(), now()-c1 from toto;
              now              |           ?column?            
-------------------------------+-------------------------------
 2013-05-28 13:35:03.996505+02 | 2013-05-28 13:20:03.996505+02
(1 row)

Guillaume.

Hors ligne

#5 28/05/2013 13:39:17

Re : Type pour un intervalle de temps

Bonjour,

Merci pour cette partie de l'aide dont je n'avais pas pris connaissance ! Cela dit, je ne me représente toujours pas comment l'info va être stockée avec le type interval... Par exemple, je voudrais enregistrer une intervention qui a duré 1 heure et 12 minutes. J'imagine que la donnée sera stockée dans le champ en question sous la forme « 01:12 ». Comment paramétrer le type de champ pour obtenir ça ? Voici ce que dit l'aide en ligne :


Les valeurs de type interval utilisent la syntaxe suivante :


[@] quantité unité [quantité unité...] [direction]

où : quantité est un nombre (éventuellement signé) ; unité est microsecond, millisecond, second, minute, hour, day, week, month, year, decade, century, millennium, une abbréviation ou un pluriel de ces unités ; direction peut être ago ou vide. L'arobase (@) est optionnel. Les valeurs des différentes unités sont implicitement ajoutées en utilisant le signe approprié.


Les nombres de jours, heures, minutes et secondes peuvent être précisées sans unité explicite. Par exemple '1 12:59:10' est compris de la même façon que '1 day 12 hours 59 min 10 sec' (1 jour, 12 heures, 59 minutes, 10 secondes).


La précision optionnelle, en dessous de la seconde, doit être comprise entre 0 et 6, et prend la précision du libellé saisi comme valeur par défaut.


En interne, les valeurs interval sont enregistrées comme des mois, jours et secondes. Ceci parce que le nombre de jours d'un mois varie et qu'un jour peut avoir 23 ou 25 heures si un changement d'heure s'applique. Comme les intervalles sont habituellement créés à partir de chaînes de caractères constantes ou de soustraction de timestamp, cette méthode de stockage fonctionne bien dans la majorité des cas. Les fonctions justify_days et justify_hours sont disponibles pour ajuster les jours et les heures qui dépassent leurs périodes habituelles.


Merci pour vos avis !

Hors ligne

#6 28/05/2013 13:41:34

gleu
Administrateur

Re : Type pour un intervalle de temps

Désolé mais je ne comprends pas la question. Si vous voulez stocker 1 heure 20, vous mettez soit '1 hour 20 minutes' soit '1:20'. Que voulez-vous paramétrer ?


Guillaume.

Hors ligne

#7 28/05/2013 13:56:09

Re : Type pour un intervalle de temps

Bonjour,


Désolé, je ne suis pas clair... Voici le script SQL de création de la table en question :


DROP TABLE IF EXISTS intervention ;
CREATE TABLE intervention 
(
	int_id serial NOT NULL,
	int_date_demande date,
	int_temps interval,
	int_demande_interne boolean,
	int_demandeur_nom character varying(255),
	int_demandeur_tel character varying(10),
	int_demandeur_adresse character varying(255),
	int_cam_id integer REFERENCES camion ON DELETE RESTRICT,
	int_ope_gid integer REFERENCES operation_reseau,
	PRIMARY KEY (int_id) 
);

C'est la colonne « int_temps » qui devra stocker « 1:20 ». Ma question : je laisse le typage tel qu'il est ci-dessus ou je dois apporter des spécifications ?


Merci encore, j'espère que c'est plus clair...


Thomas

Hors ligne

#8 28/05/2013 14:08:56

gleu
Administrateur

Re : Type pour un intervalle de temps

Il n'y a aucune spécifications à apporter. Il vous suffit ensuite de faire un INSERT du style :

INSERT INTO intervention (..., int_temps, ...) VALUES (..., '1:20', ...);

pour que votre valeur soit stockée.


Guillaume.

Hors ligne

#9 28/05/2013 14:11:50

Re : Type pour un intervalle de temps

OK super, c'est juste ça que je voulais savoir. Je m'étais juste « un peu » embrouillé avec la doc en ligne...


Bonne fin de journée !


Thomas

Hors ligne

#10 29/05/2013 16:46:28

SAS
Membre

Re : Type pour un intervalle de temps

Tiens, un spammeur...


Stéphane Schildknecht
Conseil, formations et support PostgreSQL
http://www.loxodata.com

Hors ligne

#11 29/05/2013 18:16:37

gleu
Administrateur

Re : Type pour un intervalle de temps

Spammeur supprimé, message itou.


Guillaume.

Hors ligne

Pied de page des forums