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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    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 Expert
    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
    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

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

    Merci encore,

    Naoufal

  4. #4
    Membre éclairé 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
    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
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    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 Expert

    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
    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+

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