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 :

Restitution d'un champ TIME sous Delphi


Sujet :

SQL Firebird

  1. #1
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut Restitution d'un champ TIME sous Delphi
    Bonjour,

    Après beaucoup de temps passé sans succès, j'en appelle au forum.

    Ainsi, dans 1 table, j'ai 1 colonne déclarée en TIME.
    Je n'arrive cependant pas à le restituer "proprement" dans mon appli sous XE5.

    Sous ISQL, ci après quelques essais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    SQL> SELECT COL_TIME FROM TEST01;
     
         COL_TIME
    =============
    17:45:00.0000
    17:45:00.0000
    17:45:00.0000
    15:00:02.0000
    15:00:14.0000
     
    SQL> SELECT extract(HOUR from COL_TIME)||':'||extract(MINUTE from COL_TIME)||':'||extract(SECOND from COL_TIME) FROM TEST01;
     
    CONCATENATION
    ==========================
    17:45:0.0000
    17:45:0.0000
    17:45:0.0000
    15:0:2.0000
    15:0:14.0000
     
    SQL> SELECT SUBSTRING(100 + extract(HOUR from COL_TIME) FROM 2 FOR 2)||':'||SUBSTRING(100 + extract(MINUTE from COL_TIME) FROM 2 FOR 2)||':'||SUBSTRING(100 + extract(SECOND from COL_TIME) FROM 2 FOR 2) FROM TEST01;
     
    CONCATENATION
    ==================================================================
    17:45:00
    17:45:00
    17:45:00
    15:00:02
    15:00:14
    C'est bien sûr ce dernier look que je souhaite

    Dans mon appli, j'utilise les composants UIB, et un champ TIME (type interne uftTime = 14) est restitué sous forme d'un Cardinal :
    Quelques valeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    17:45:00 => 639000000
    15:00:02 => 540020000
    15:00:14 => 540140000
    Mais comment passer du Cardinal à l'heure correspondante sachant que:
    • je ne dois pas être dépendant d'une PS ou de fonctions serveur
    • je ne peux pas faire 1 requête supplémentaire pour le type TIME (Cf. la 3ème sous ISQL): mon code exploite le type interne "uftxxxx" pour afficher chaque valeur dans 1 grille avec le bon format

    Je suis preneur de toutes pistes...
    PS: FB 2.1.7
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Je n'ai pas de firebird sous la main pour tester, mais pourquoi pas tout simplement SELECT cast(COL_TIME as CHAR(08)) qui fonctionne très bien sous d'autres SGBD.

  3. #3
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Bonjour,
    Citation Envoyé par escartefigue Voir le message
    Je n'ai pas de firebird sous la main pour tester, mais pourquoi pas tout simplement SELECT cast(COL_TIME as CHAR(08)) qui fonctionne très bien sous d'autres SGBD.
    Parce que cela implique une requête supplémentaire...

    • soit quand j'exploite les données reçues: ainsi pour 100 lignes ce sera 100 selects de plus, et il me faudra cibler la bonne occurrence (la clé n'est pas systématiquement présente dans les données reçues) pour du mono-table; sans même penser à 1 solution en cas de jointure
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    SELECT cast(COL_TIME as CHAR(08)) De toute façon, cela lèvera une erreur "String troncation"
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Serge
    Citation Envoyé par SergioMaster Voir le message
    SELECT cast(COL_TIME as CHAR(08)) De toute façon, cela lèvera une erreur "String troncation"
    Pas faux il faut 13 caractères...
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Sinon, puisque c'est du FB 2.1 pourquoi ne pas utiliser des UDF ie.

    celle des FreeAdHoc
    F_GFORMATD Fonction de adhoc
    Entrypoint gformatd Compatibles UTF-8
    Entrée CSTRING(254)
    TIMESTAMP Format comme Date/Heure
    Date avec heure optionnelle
    Sortie CSTRING(254) Formate la date et l’heure selon le paramètre 1
    Pattern pour parameter 1
    d = Jour (1 chiffre si < 10)
    dd = Jour, toujours 2 chiffres
    m = Mois (1 chiffre si < 10)
    mm = Mois, toujours 2 chiffres
    yy = Année (1 chiffre si < 10, sinon 2 chiffres)
    yyyy = Année, toujours 4 chiffres
    h = Heure (1 chiffre si < 10)
    hh = Heure, toujours 2 chiffres
    n = Minute (1 chiffre si < 10)
    nn = Minute, toujours 2 chiffres
    s = Seconde (1 chiffre si < 10)
    ss = Seconde, toujours 2 chiffres
    tous les autres signes repris dans le paramètre 1 resteront à leur place dans le résultat.
    tu n'as pas non plus testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUBSTRING(a.HEURE FROM 1 FOR 8) FROM TABLE_NAME a ;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Merci Serge pour tes propositions, cependant elles sont hors cahier des charges

    Ceci dit, je pense avoir trouvé
    le cardinal contient le 'TIME' en nombre de millisecondes...

    Les 5 chiffres de gauche sont donc des secondes.


    soit 17 heures et 3/4 d'heure (45 minutes)

    j'ai plus qu'à trouver une fonction de conversion/mise en forme

    Au détour de mes recherches je suis tombé sur ça : https://vdoc.pub/documents/the-fireb...s-3tn3u8rqttag
    C'est en anglais et ça date un peu, mais à ce prix, pourquoi se priver
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  8. #8
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut souci résolu
    Je viens de pondre ça en piochant ici et là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function FormatuftTime(nbMillisecondes:Cardinal;IncludingMS:Boolean):string;  // formatage champ de type TIME
    var st,nbMS:string;
        ss,mm,hh,nbsec:Integer;
    begin
         st:=UIntToStr(nbMillisecondes);
         st:=DupeString('0',9-Length(st))+st;
         nbMS:=RightStr(st,4);
         st:=LeftStr(st,5);
         nbsec:=StrToInt(st);
         hh:=(nbsec mod SecsPerDay) div SecsPerHour;
         mm:=((nbsec mod SecsPerDay) mod SecsPerHour) div SecsPerMin;
         ss:=((nbsec mod SecsPerDay) mod SecsPerHour) mod SecsPerMin;
         Result:=RightStr('0'+IntToStr(hh),2)+':'+RightStr('0'+IntToStr(mm),2)+':'+RightStr('0'+IntToStr(ss),2);
         if IncludingMS then
            Result:=Result+'.'+nbMS;
    end;
    peut-être pas optimal, mais répond à mon besoin.

    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/07/2015, 19h03
  2. MySQL mettre un champ à NULL sous Delphi
    Par PhilLU dans le forum Delphi
    Réponses: 0
    Dernier message: 30/05/2015, 18h37
  3. Réponses: 1
    Dernier message: 11/08/2005, 17h33
  4. Champs Time sous Interbase 5
    Par PrinceMaster77 dans le forum InterBase
    Réponses: 3
    Dernier message: 06/04/2004, 21h52
  5. Réponses: 4
    Dernier message: 27/03/2002, 11h03

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