Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/06/2004, 11h24   #1
Membre à l'essai
 
Inscription : mai 2002
Messages : 39
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 39
Points : 20
Points : 20
Envoyer un message via MSN à neness
Par défaut Resutlat de calcul sur date formaté

Salut à tous.

j'ai une table SESSIONS

Code :
1
2
 
CREATE TABLE SESSIONS (start timestamp, stop timestamp, number interger)
je dois faire la requète suivante sur cette table
Code :
1
2
 
SELECT start,stop, (stop - start) AS "duration" WHERE number = 12;
le problème est que interbase me renvoie le calcul sur les dates en format float, je le voudrais en format time.

est-ce possible ?

si oui, comment pourrais-je faire ?

Merci à tous.
neness est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2004, 13h07   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Oui c'est normal car les timestamps sont enregistés physiquement comme ça.

Donc la partie entière du résultat est le nombre de jour entre stop et start et la partie décimale les heures/minutes/secondes/millisecondes qu'il faut interpreter correctement.

Le plus simple est d'utiliser des fonctions UDF comme dans la Rfunc qui est gratuite.

Votre requete deviendrait :
Code :
1
2
SELECT s.start, s.stop, s.stop-s.start, daysbetween(DOUBLETODATE(0), DOUBLETODATE(s.stop-s.start)) AS duree_jour, cast(DOUBLETOTIME(s.stop-s.start) AS time) AS duree_time
FROM sessions s
L'ecart entre stop et start est donc de duree_jour+duree_time.
Car duree time ne renvoit qu'une valeur <24H.

les fonctions que j'ai utilisé dans rfunc :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DECLARE EXTERNAL FUNCTION DAYSBETWEEN
   TIMESTAMP, TIMESTAMP
   RETURNS INTEGER BY VALUE
  ENTRY_POINT 'fn_daysbetween'  MODULE_NAME 'rfunc';
 
DECLARE EXTERNAL FUNCTION DOUBLETODATE
   DOUBLE PRECISION
   RETURNS TIMESTAMP FREE_IT
  ENTRY_POINT 'fn_doubletodate'  MODULE_NAME 'rfunc';
 
DECLARE EXTERNAL FUNCTION DOUBLETOTIME
   DOUBLE PRECISION
   RETURNS TIMESTAMP FREE_IT
  ENTRY_POINT 'fn_doubletotime'  MODULE_NAME 'rfunc';
Mais j'aurai pu utilisé que le daysbettween et le DoubleToDate comme ceci :
Code :
1
2
SELECT s.start, s.stop, s.stop-s.start, daysbetween(DOUBLETODATE(0), DOUBLETODATE(s.stop-s.start)) AS duree_jour, cast(DOUBLETODATE(s.stop-s.start) AS time) AS duree_time
FROM sessions s
car je cast le résultat en time.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2004, 13h21   #3
Membre à l'essai
 
Inscription : mai 2002
Messages : 39
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 39
Points : 20
Points : 20
Envoyer un message via MSN à neness
super, je vais travailler comme cela.

j'ai réussi à créer les procedure (UDFs).

Mais quand jexecute le requète depuis IBManager j'ai la réponse suivante.

Citation:
fmSQLEditor.Query:
Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements.
Access to UDF library "rfunc.DLL" is denied by server administrator.
je n'ai fait que créer les functions par copier coller de ton post.
et tout c'est bien passé.
neness est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2004, 13h55   #4
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Il faut installer l'UDF sur le serveur.
Si le serveur est de type windows il faut copier rfunc.dll dans le répertoire <interbase>/UDF.
Rfunc se télécharge ici :
http://rfunc.sourceforge.net/
Menu Files puis télécharger la version windows ou unix selon.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2004, 15h08   #5
Membre à l'essai
 
Inscription : mai 2002
Messages : 39
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 39
Points : 20
Points : 20
Envoyer un message via MSN à neness
Super ça marche nickel.

j'ai cependant un petit problème depuis cette modif.

Dans delphi, quand j'arrive à la fin de la dbgrid, j'ai un message d'erreur.

Code :
1
2
3
4
5
6
7
8
 
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EConvertError WITH message 'Invalid argument to time encode'. Process stopped. USE Step OR Run TO continue.
---------------------------
OK   Help   
---------------------------
j'avais eu le même message d'erreur quand j'avais oublié de definir les champ varchar "charSet" en "ISO8859_1" .

Merci.
neness est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2004, 15h22   #6
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Difficile de répondre, faudrait voir le code.
Vous faites du SQL dynamique ? Paramétré ? Les TField sont créés dynamiquement ou vous les avez figés ?

Pourquoi en fin du dbgrid ? une des données ne serait elle pas à null (le stop par exemple...)
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2004, 15h34   #7
Membre à l'essai
 
Inscription : mai 2002
Messages : 39
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 39
Points : 20
Points : 20
Envoyer un message via MSN à neness
j'ai trouvé l'erreur !



en fait quand je crée une session ouverte j'insère comme valeur de StopDate = 0.
et donc, la date est "31/12/1899"
c'est donc la calcul de la valeur stop.

Merci beaucoup.

maintenant, je defini le stop d'une session ouverte à l'heure actuelle et plus à zéro.




Ps : c'est toujours un plaisirs de poser une quéstion sur ce forum
neness est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h28.


 
 
 
 
Partenaires

Hébergement Web