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 :

Problème avec la conversion du DateTime


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Problème avec la conversion du DateTime
    Bonjour Tout le monde,

    J'ai rencontré un sérieux problème dans un projet.
    Je vous explique la situation avant de procéder à un exemple concret:
    Nous possédons une table Congés et on souhaite afficher la liste des personnes qui ont demandé le congé entre 2 dates.
    Après la création de la procédure stockées, une erreur s'est produite sur la conversion de la date en nvarchar.

    Si vous pouvez m'aider à résoudre ce petit problème dans cet exemple:
    table Personne qui comporte comme Colonnes: idPersonne int, nomPersonne nvarchar(50) et dateNaissancePersonne DateTime,
    La procédure qui permet d'extraire les personnes qui ont la date de naissance > à la date passée en argument:

    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
     
    --On Vérifie si la procédure existe déjà, si oui, on la supprime
    IF EXISTS (SELECT name
           FROM sysobjects
           WHERE name = 'Procedure_sur_Personne'
           AND type = 'P')
        DROP PROCEDURE [dbo].[Procedure_sur_Personne]
    GO
     
     
    --On passe un argument DateTime
     
    CREATE PROCEDURE [dbo].[Procedure_sur_Personne] (@DateNaissancePersonne DateTime = null)
    AS
    declare @sql nvarchar(300)
    BEGIN
        --strip any time portion from the date passed in
        SELECT @DateNaissancePersonne = Convert(datetime,convert(char(10),@DateNaissancePersonne,101)) 
    set @sql = 'SELECT * FROM dbo.Personne';
    if @DateNaissancePersonne is not null
    	set @sql =@sql + ' WHERE (dateNaissancePersonne > '+ @DateNaissancePersonne +')';
    print @sql;
    exec @sql;
     
    END
    Si la date a été passé en argument, on va ajouter la clause WHERE qui extrait les personnes par date, sinon on affiche tous les personnes.

    Quand j'exécute la procédure stockée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DECLARE @DN DateTime
    SET @DN = '01/01/1970'
    EXECUTE [dbo].[Procedure_sur_Personne] @DN
    Je reçoi ce message d'erreur:
    Msg*241, Niveau*16, État*1, Procédure*Procedure_sur_Personne, Ligne*13
    Échec de la conversion d'une valeur datetime à partir d'une chaîne de caractères.
    Si vous pouvez me résoudre ce problème, je serai très reconnaissant.

    Merci BCP,

    Cordialement Votre,

    Naoufal

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    bonjour,

    dans ton cas, je ne vois pas à quoi sert ta conversion en varchar. Je me contenterais d'un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE PROCEDURE [dbo].[Procedure_sur_Personne] (@DateNaissancePersonne DateTime = NULL)
    AS
     
    IF @DateNaissancePersonne IS NOT NULL
        SELECT * FROM dbo.Personne WHERE dateNaissancePersonne > @DateNaissancePersonne
    else
         SELECT * FROM dbo.Personne
    Emmanuel T.

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merciiiiiii kagemaru, ça marche nikel, le petit problème a été résolu

    Merci encore,

    Naoufal

  4. #4
    Membre régulier Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Points : 92
    Points
    92
    Par défaut
    Salut
    juste une remarque, le problème est résolu dans le cas ou il y a un seul critère. mais dans le cas ou il y a plusieurs il y aura un problème.
    je pense qu'on doit chercher une solution, écriture d'une requête paramétrable ou personnalisé comme il a procédé Dr.SoFtNaF.
    si tu es d'accord avec moi Dr.SoFtNaF, tu peux enlever le tag 'Résolu' ?

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Mercii kodo pour l'initiative
    En faite, après on a rencontré un gros problème comme kodo a signalé, on arrive à avoir dans notre where, plusieurs paramètres, alors la solution proposé ne résoudre pas le problème, si on s'amuse à mettre if elseif pour récrire toute la requête, à la fin on va arriver vers une grande procédure, on été tous entrain de chercher une solution est la posté ici, Tant que Mr. Kodo a pri l'initation, je mets cette article en débat pour avoir une solution finale.

    Merciii encore Kodo

    Cdlmt Votre,

    Naoufal

  6. #6
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Quelques observations :
    1 – Ton code n’est pas protégé contre l’injection SQL. Pour te protéger de l’injection SQL, utilises autant que possible les paramètres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE sp_executesql @SqlStmt, @ParamDefinition, @Param1=... , @Param2=...
    Remarque : L’utilisation des paramètres te permet de résoudre les 2 problèmes que sont l’injection SQL et la multiplicité des paramètres telle que décrite dans ton précédent message.

    2 – Pour les dates exprimées sous forme de chaine de caractère, et afin d’éviter les erreurs (échec de conversion ec..), il est fortement recommandé d’utiliser le format ISO 8601 :
    yyyy-mm-ddThh:mm:ss[.mmm]

    En effet ce format :
    - correspond à une norme internationale,
    - ne dépend du format de la date (ne dépend pas de SET DATEFORMAT)
    - est multilingue (ne dépend pas de SET LANGUAGE)
    - n'a pas besoin d'une fonction CAST (ou CONVERT) pour convertir la chaine en DATETIME.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @DN DateTime
    SET @DN = '1970-01-01T00:00:00'
    EXECUTE [dbo].[Procedure_sur_Personne] @DN
    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    on arrive à avoir dans notre where, plusieurs paramètres
    salut, il faudrait décrire complètement le besoin
    merci
    Emmanuel T.

  8. #8
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour Tout le monde,
    DSL pour ce retard, j'été en mission, et voilà de retour, je vous explique ce que je souhaite faire avec cette procedure par un exemple:
    ma table qui contient d'autres champs, exemple Ville, pays, langue (puis ce qu'ici on parle plusieurs langues ).
    Donc si je modifie ma procédure ça va être:
    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
    30
    31
    32
    33
     
    --On Vérifie si la procédure existe déjà, si oui, on la supprime
    IF EXISTS (SELECT name
           FROM sysobjects
           WHERE name = 'Procedure_sur_Personne'
           AND type = 'P')
        DROP PROCEDURE [dbo].[Procedure_sur_Personne]
    GO
     
     
    --On passe un argument DateTime
     
    CREATE PROCEDURE [dbo].[Procedure_sur_Personne] (@DateNaissancePersonne DateTime = NULL, @VillePersonne nvarchar(50)= NULL, @PaysPersonne nvarchar(50)=NULL, @LanguePersonne nvarchar(50) = NULL)
    AS
    declare @sql nvarchar(300)
    BEGIN
        --strip any time portion from the date passed in
        SELECT @DateNaissancePersonne = Convert(datetime,convert(char(10),@DateNaissancePersonne,101)) 
    SET @sql = 'SELECT * FROM dbo.Personne';
    IF @DateNaissancePersonne IS NOT NULL OR @VillePersonne IS NOT NULL OR @PaysPersonne IS NOT NULL OR @LanguePersonne iS NOT NULL
    BEGIN
    SET @sql =@sql + ' WHERE ';
        IF @DateNaissancePersonne IS NOT NULL
    	SET @sql =@sql + '(dateNaissancePersonne > '+ @DateNaissancePersonne +')';
        ELSE IF @VillePersonne IS NOT NULL
    	SET @sql += " AND (villePersonne LIKE '" + @VillePersonne + "')";
        ELSE IF @LanguePersonne IS NOT NULL
            SET @sql += " AND (languePersonne LIKE '" + @LanguePersonne + "')";
    END
    print @sql;
    exec @sql;
     
    END
    Si j'exécute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DECLARE @DN DateTime
    SET @DN = '1970-01-01T00:00:000'
    EXECUTE [dbo].[Procedure_sur_Personne] @DN
    Je souhaite avoir les personnes ayant une date de naissance supérieur à celle passer en pramètre, si on ajoute un autre paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DECLARE @DN DateTime
    SET @DN = '1970-01-01T00:00:000'
    SET @VILLE = 'Casablanca'
    EXECUTE [dbo].[Procedure_sur_Personne] @DN, @VILLE
    On doit récupérer la liste des personnes ayant date de naissance supérieur à celle passer en paramètre et qu'ils se trouvent à Casablanca
    Ansi de suite,
    Imaginons tous ensemble, qu'on a 20champs, (Ce n'est pas pour le cas d'une simple table Personne, mais pour un métier, comme les congés en jointure avec les Personnes qui est en jointure avec filiale ...)
    Là, à la place de mettre une simple requête SQL, on doit passer par des requêtes imbriquées, on s'amuse à ajouter des conditions à chaque fois qu'on passe un paramètre.

    Merci pour votre support.

    Cordialement Votre,

    Naoufal

Discussions similaires

  1. [Débutant] Problème avec la conversion de DbNull
    Par santic19 dans le forum VB.NET
    Réponses: 6
    Dernier message: 25/06/2015, 11h29
  2. Réponses: 6
    Dernier message: 18/03/2015, 14h22
  3. Problème avec la conversion en hexadécimal
    Par sanzero dans le forum C
    Réponses: 2
    Dernier message: 10/06/2011, 16h00
  4. Réponses: 3
    Dernier message: 28/12/2006, 15h06
  5. (Problème avec...) conversion de std::string en char
    Par crossbowman dans le forum SL & STL
    Réponses: 7
    Dernier message: 05/03/2006, 19h54

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