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 :

Convertir un nombre du type jourmoisannée.00 en datetime


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 71
    Points : 38
    Points
    38
    Par défaut Convertir un nombre du type jourmoisannée.00 en datetime
    Bonjour à tous,

    Je coince sur cette conversion... une table de la base sur laquelle je travaille stocke une date en décimal, sous forme jjmmaaaa.00.
    Par exemple la date d'aujourd'hui serait stockée 6042012.00. Au passage, vous remarquez l'absence de "0" avant le 6, du coup la taille du chiffre varie...
    Bref, c'est bien pourri, et moi avec tout ça je sais pas comment convertir ce champ en datetime !
    J'ai essayé des CONVERT et des CAST en veux-tu en voilà, mais y'a rien qui passe...

    Une idée ?

    Merci pour votre aide !

  2. #2
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    declare @var decimal = 6042012.00
    SELECT RIGHT('0' + SUBSTRING(CAST(@var as varchar(8)),1,8),8)
    Etienne ZINZINDOHOUE
    Billets-Articles

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 71
    Points : 38
    Points
    38
    Par défaut
    Merci pour ta réponse.

    Avec ton code, j'obtiens malheureusement l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Arithmetic overflow error converting numeric to data type varchar.
    L'autre souci, c'est que ton code rajoute forcément le '0' au début, alors que dans ma base j'ai à la fois des dates à 8 chiffres (qui du coup n'ont pas besoin du '0') et d'autres à 7.
    Comme je voudrais me servir de ce code dans une requête (sur toutes les valeurs d'un champ, pas une valeur précise), j'ai besoin que ça soit une requête "générale", qui marche pour les 2 types de dates donc.
    Je sais pas si c'est très clair...

  4. #4
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Peux-tu poster le DDL de la table ?
    Voici une petite fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create function getdatejjmmaaaa (@v_decimal decimal)
    returns varchar(8)
    as
    begin
    declare @var varchar(8)
    SELECT @var = RIGHT('0' + SUBSTRING(CAST(@v_decimal AS varchar(8)),1,8),8)
    return @var
    END
    pour tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    create table t (c decimal)
    insert into t values (6042012.00),(6042012.01),(16042012.00)
    select dbo.getdatejjmmaaaa(c) from t
    Etienne ZINZINDOHOUE
    Billets-Articles

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 71
    Points : 38
    Points
    38
    Par défaut
    Merci pour le 2e essai.
    Je n'ai pas lancé les scripts (je préfère pas toucher à la base), mais avec ma requête SELECT, j'obtiens le même type de message d'erreur en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RIGHT('0' + SUBSTRING(CAST(mon_champ AS varchar(8)),1,8),8)
    Excuse mon ignorance, mais c'est quoi le DDL ? J'utilise SQL server management studio express, je peux trouver ça où ?

    Merci !

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Beaucoup de conversions, j'ai détaillé les étapes une par une pour que vous compreniez ce qui se passe :
    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
    declare @v_decimal decimal(10,2)
    select @v_decimal = 6042012.00
     
    select @v_decimal                                                                                                                 as etp1
         , cast(@v_decimal as int)                                                                                                    as etp2
         , cast(@v_decimal as int) + power(10, 9)                                                                                     as etp3
         , cast(cast(@v_decimal as int) + power(10, 9) as char(10))                                                                   as etp4
         , right(cast(cast(@v_decimal as int) + power(10, 9) as char(10)), 8)                                                         as etp5
         , STUFF(right(cast(cast(@v_decimal as int) + power(10, 9) as char(10)), 8), 3,0,'-')                                         as etp6
         , STUFF(STUFF(right(cast(cast(@v_decimal as int) + power(10, 9) as char(10)), 8), 3,0,'-'),6,0,'-')                          as etp7
         , convert(datetime,  STUFF(STUFF(right(cast(cast(@v_decimal as int) + power(10, 9) as char(10)), 8), 3,0,'-'),6,0,'-'), 105) as dt
     
     
    etp1        etp2        etp3        etp4       etp5     etp6      etp7       dt
    ----------- ----------- ----------- ---------- -------- --------- ---------- -----------------------
    6042012.00  6042012     1006042012  1006042012 06042012 06-042012 06-04-2012 2012-04-06 00:00:00.000

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 71
    Points : 38
    Points
    38
    Par défaut
    !
    Et bien en tout cas, ça marche !
    J'aurais été incapable de trouver ça toute seule, y'a des fonctions que je connais même pas...
    Je vais étudier tout ça, merci bcp en tt cas !

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

Discussions similaires

  1. Convertir un nombre d'heure format HH:MM
    Par jerome_sinclair dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/11/2005, 21h51
  2. Comment convertir un nombre de jours décimal en date
    Par Soutou dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/11/2005, 00h57
  3. Convertir un string en type property ou object
    Par bencot dans le forum Langage
    Réponses: 2
    Dernier message: 20/11/2004, 20h18
  4. Réponses: 4
    Dernier message: 06/06/2004, 12h07
  5. Convertir une date en type string
    Par ziboux dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/10/2003, 10h52

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