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

Développement SQL Server Discussion :

Incompatibilité type "time" et Calcul d'un somme de la même colonne Time


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Points : 55
    Points
    55
    Par défaut Incompatibilité type "time" et Calcul d'un somme de la même colonne Time
    Bonjour à toutes et à tous, je rencontre un problème au niveau de SQL server, j'importe des données a partir d'un fichier excel vers la base de données à travers mon application, il ya un champ dans le fichier excel qui est sous le format hh:mm:ss , lors de l'importation dans ma base de données j'ai une erreur au niveau de l'application me disant que le type date time ne peut pas être converti en type Time qui est le type du champ de ma base de données, donc j'ai changé le type de la colonne dans ma base en datetime pour pouvoir importer mes données , mais le problème c'est que sur mon fichier excel j'ai les données sous forme par exemple 02:53:21 alors que sur la base de données ca devient 1899-12-30 02:53:21 comme ca : Pièce jointe 289746, alors que moi je n'ai pas besoin de cette date , et par la suite je voudrai calculer dans ce champ là la somme du temps comme suit (heure)+(minute/60)+(seconde/3600), j'utilise une requête mais jusqu'a maintenant ca ne me calcule rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Date, CAST (SUM(DATEPART(hour, Temps) + DATEPART(minute, Temps) / 60 + DATEPART(second, Temps)/3600 ) AS DECIMAL(16,2)) AS tps FROM Cadences group by Date,Temps
    voici une capture d'écran du résultat de la requête:
    Pièce jointe 289748

    j'espère avoir de l'aide de votre part , merci d'avance

  2. #2
    Membre du Club
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Points : 55
    Points
    55
    Par défaut
    !!!! aucune aide ?

  3. #3
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Tu peux tout à fait convertir un datetime en time avec un cast, il faudrait déjà trouver pourquoi tu as une erreur à l'importation au départ.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  4. #4
    Membre du Club
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Points : 55
    Points
    55
    Par défaut
    l'erreur de l'importation était parceque le type de la colonne dans le fichier excel et personnalisé d'une façon qu'il soit hh:mm:ss alors que sur SQL il ne prend pas ca comme time mais comme date time donc on mettant le type de la colonne SQL en Datetime , l'importation se fait bien mais comme j'ai expliqué en ajoutant la date par défaut chose que je ne veux pas

  5. #5
    Membre du Club
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Points : 55
    Points
    55
    Par défaut
    j'ai utilisé cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CONVERT(char(10), Temps, 108) as CSTTime  from Cadences
    pour convertir le champ datetime et avoir en sortie que les heures , et c'est ce que je voulais , maintenant reste a savoir comment faire cette equation a l'aide de SQL

    ce que j'ai comme entrée 02:39:52 =>l'équation a faire avec SQL heure+ (minutes)/60+ (secondes)/3600 = Résultat de ma requête 2,66444444444

  6. #6
    Membre du Club
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Points : 55
    Points
    55
    Par défaut
    j'ai essayer ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH TMP AS (
    	SELECT  CONVERT(varchar(10), Temps, 108) as CSTTime , RIGHT('0' + Temps, 9) C
    	FROM Cadences
     
    )
     
     
    SELECT		CSTTime,CAST(LEFT(C, 2) AS DECIMAL(10,8)) 
    			+ CAST(SUBSTRING(C, 4, 2) AS DECIMAL(10,8)) / 60
    			+ CAST(SUBSTRING(C, 7, 2) AS DECIMAL(10,8)) / 3600
    FROM TMP
    mais ca me donne l'erreur : Échec de la conversion de la date et/ou de l'heure à partir d'une chaîne de caractères.

  7. #7
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    quelle version de SQL Server. Merci d'indiquer cette information de base lorsque tu poses ta question.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  8. #8
    Membre du Club
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Points : 55
    Points
    55
    Par défaut
    SQL server 2014

  9. #9
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Je pense que tu prends le problème à l'envers. Tout ce que je dis là, c'est vrai/vérifié sous Oracle, mais je suis convaincu que c'est valable pour tous les SGBDR.

    Dans la base de données, quand tu charges une valeur de type time, il stocke en fait un réel entre 0 et 1. Par exemple quand tu charges 06h00, le système stocke en fait 0.25 ( car 6 heures , c'est 25% d'une journée).

    Et si le système te montre au final 06h00:00 au lieu de 0.25, c'est parce que le système est sympa, il formatte les heures dans un format adapté pour les humains.

    Essaie quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //REQ1 : 
    select   temps-0 from Cadences
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // REQ2 
    select temps - cast('00:00:00' , ... ) from cadences.
    Je ne connais pas la syntaxe de cast ... à toi de jouer.

    Ceci devrait te donner une durée en nombre de jours.

    Pour convertir en nombre d'heures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //REQ3
    select 24*( temps-0) from Cadences
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //REQ4
    select 24* ( temps - cast('00:00:00' , ... ) ) from cadences.
    Je décompose étape par étape, parce que peut-être sue REQ1 fonctionne, alors que REQ3 ne fonctionne pas.

    Si ta requête avec les Substr() ne marche pas, c'est pour la raison ci-dessous.
    Dans le moteur SQL; les données de type TIME sont traitées comme des réels ; pas question de faire des Substr() sur ces données. La conversion de réel en string ou en pseudo string se fait à l'affichage comme déjà expliqué. Je pense même que cette conversion se base sur des paramètres Windows de la machine 'cliente' si tu es sous windows.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  10. #10
    Membre du Club
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Points : 55
    Points
    55
    Par défaut
    tu entre dans une discussion qui n'a rien a voir avec ce que je veux moi , je ne veux pas afficher les heures ou quoi que se soit , je veux calculer en utilisé la formule que j'ai cité avant donc l'affichage je l'ai dépasser , maintenant je veux calculer ce qui est affiché

  11. #11
    Membre du Club
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Points : 55
    Points
    55
    Par défaut

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il faut transtyper plus tôt dans vos calculs.
    Une division d'une INT par un autre INT donne un INT.

    du coup par exemple DATEPART(minute, Temps) / 60 donnera toujours 0.

    Remplacez par DATEPART(minute, Temps) / 60. (notez le point après 60 qui en fait un DECIMAL), et le résultat devrait être correct.

  13. #13
    Membre du Club
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Points : 55
    Points
    55
    Par défaut
    Bonjour, la solution n'a rien a voir avec le . parce que j'ai dèjà le résultat qu'il faut avec cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH TMP AS (
    	SELECT  CONVERT(varchar(10), Temps, 108) as CSTTime , RIGHT(  Temps, 10) C
    	FROM Cadences
     
    )
     
     
    SELECT		CSTTime,CAST(LEFT(C, 2) AS DECIMAL(10,8)) 
    			+ CAST(SUBSTRING(C, 4, 2) AS DECIMAL(10,8)) / 60
    			+ CAST(SUBSTRING(C, 7, 2) AS DECIMAL(10,8)) / 3600
    FROM TMP
    sauf que je vois qu'il ne prend pas en compte la conversion que je donne vu qu'il prend le champ comme il était avant avec la date alors que moi j'ai intégrer le convert pour qu'il ne calcul que les heures , voici une capture :
    Pièce jointe 290153

    moi ce que je veux c'est les chiffres qui sont après le 99... , NB: le 99 c'est parcequ'il prend le 1899 de la date alors que moi j'ai mentionné la conversion du champ pour but d'avoir que le temps comme le champ CSTTime, donc ce qu'il me faut c'est comment indiqué dans la requête de prendre le champ CSTTime et non pas le champ Temps.

  14. #14
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par andyajram Voir le message
    Bonjour, la solution n'a rien a voir avec le .
    Avez-vous essayé ?

    Citation Envoyé par andyajram Voir le message
    parce que j'ai dèjà le résultat qu'il faut avec cette requête ...
    C'est normal, dans la requête en question vous transtypez le numérateur. Vous avez donc un division d'un DECIMAL par un INT, contrairement à la requête de votre premier post où vous avez une division d'un INT par un INT.

  15. #15
    Membre du Club
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Points : 55
    Points
    55
    Par défaut
    non mais a part ça il ne divise pas ce que je veux mais il divise la partie Date du champ d'origine et non pas quand je l'ai converti en juste Time .

  16. #16
    Membre du Club
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Points : 55
    Points
    55
    Par défaut
    il prend par exemple ca en division : 1899-12-30 02:39:52.000
    et non pas ca 02:39:52.000
    je sais que le problème est ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CSTTime,CAST(LEFT(C, 2) AS DECIMAL(10,8)) 
    			+ CAST(SUBSTRING(C, 4, 2) AS DECIMAL(10,8)) / 60
    			+ CAST(SUBSTRING(C, 7, 2) AS DECIMAL(10,8)) / 3600
    dans l’ordonnancement que je donne par exemple pour les heures il doit prendre Left(C,12) et les minutes (C,14,2) et les secondes (C,17,2) mais quand je fais ca il me donne l'erreur
    Erreur de conversion du type de données varchar en numeric.

  17. #17
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Si temps prend la valeur 1899-12-30 02:39:52.000, et si C est défini par C = right (temps, 10), je pense que C vaut ":39:52.000" et non "02:39:52.000"
    Et donc left(c,2), ça nous donne un truc non numérique, d'où le plantage au moment de convertir en numérique.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  18. #18
    Membre du Club
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Points : 55
    Points
    55
    Par défaut
    oui je crois que c'est ca , mais alors C doit prendre qu'elle valeur ? j'ai essayer plusieurs valeur mais aucune ne marche a part le 10 , et quand C= 10 ca ne donne un résultat que quand je remplace ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CSTTime,CAST(LEFT(C, 12) AS DECIMAL(10,8)) 
    			+ CAST(SUBSTRING(C, 14, 2) AS DECIMAL(10,8)) / 60
    			+ CAST(SUBSTRING(C, 17, 2) AS DECIMAL(10,8)) / 3600

    par ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CSTTime,CAST(LEFT(C, 2) AS DECIMAL(10,8)) 
    			+ CAST(SUBSTRING(C, 4, 2) AS DECIMAL(10,8)) / 60
    			+ CAST(SUBSTRING(C, 7, 2) AS DECIMAL(10,8)) / 3600
    et comme j'ai dis avant dans ce cas ca prend la date aussi en considération

  19. #19
    Membre du Club
    Homme Profil pro
    ertertaertar
    Inscrit en
    Mai 2013
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ertertaertar

    Informations forums :
    Inscription : Mai 2013
    Messages : 314
    Points : 55
    Points
    55
    Par défaut
    j'ai donner a C la valeur 13 et ca ma donner ce résultat :
    Pièce jointe 290218

    mais pourquoi les résultats se répètent et ca ne me donne pas le truc correcte ?

  20. #20
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    A 15h57, tu postais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WITH TMP AS (
    	SELECT  CONVERT(varchar(10), Temps, 108) as CSTTime , RIGHT(  Temps, 10) C
    	FROM Cadences
     
    )
     
     
    SELECT		CSTTime,CAST(LEFT(C, 2) AS DECIMAL(10,8)) 
    			+ CAST(SUBSTRING(C, 4, 2) AS DECIMAL(10,8)) / 60
    			+ CAST(SUBSTRING(C, 7, 2) AS DECIMAL(10,8)) / 3600
    FROM TMP
    A priori, l'erreur est en ligne 2, où il faudrait remplacer 10 par 12. Et toi tu essaies de faire des changements plus bas...

    Comme je n'ai jamais utilisé SQLServer, j'avancerais étape par étape :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH TMP AS (
    	SELECT  CONVERT(varchar(10), Temps, 108) as CSTTime , RIGHT(  Temps, 10) C, RIGHT(  Temps, 12) C2
    	FROM Cadences
     
    )
     
     
    SELECT		CSTTime, C, C2 
    FROM TMP
    Quand tu exécutes cela, est-ce que ça marche, qu'est-ce que ça donne comme résultat, est-ce que ça t'inspire pour la suite ?
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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