IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

Resutlat de calcul sur date formaté


Sujet :

SQL Firebird

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 39
    Points : 34
    Points
    34
    Par défaut Resutlat de calcul sur date formaté
    Salut à tous.

    j'ai une table SESSIONS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create table SESSIONS (start timestamp, stop timestamp, number interger)
    je dois faire la requète suivante sur cette table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    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.

    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é.

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    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.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    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...)

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul sur date
    Par jeff37 dans le forum Linux
    Réponses: 2
    Dernier message: 10/04/2006, 13h37
  2. [ WinDev ] Calcul sur date dans SQL
    Par Tchupacabra dans le forum Langage SQL
    Réponses: 8
    Dernier message: 28/02/2006, 12h12
  3. Calcul sur date dans SQL
    Par Tchupacabra dans le forum WinDev
    Réponses: 4
    Dernier message: 27/02/2006, 19h23
  4. [débutant] calcul sur date
    Par Regis.C dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 04/01/2005, 10h51
  5. Calcul sur date
    Par Thomad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/09/2003, 08h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo