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

MS SQL Server Discussion :

Error converting data type nvarchar to datetime [2012]


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 193
    Points : 89
    Points
    89
    Par défaut Error converting data type nvarchar to datetime
    Salut
    J'ai un gros soucis avec le type datetime2 de sql server 2012.
    J'ai une requête qui marche très bien avec sql server 2008 mais quand je l'exécute en sql server 2012, ça me génère une erreur :

    "Msg 8114, Level 16, State 5, Procedure ETAT_RAPPORT_VENTE_PERIODE_EVD, Line 0
    Error converting data type nvarchar to datetime."


    Voic la requête sql server :
    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
     
    USE [MSELLER]
    GO
    /****** Object:  StoredProcedure [dbo].[ETAT_RAPPORT_VENTE_PERIODE_EVD]    Script Date: 19/11/2013 11:28:18 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
      ALTER PROCEDURE [dbo].[ETAT_RAPPORT_VENTE_PERIODE_EVD]
      @IdDepot int,
      @dateA datetime,
      @dateB datetime
     
      AS
      SET NOCOUNT ON
     
      SELECT [ID_SIM],[Id_Caissier], sum([MTTREGLEMENT])as Montant,
      --(SELECT [NOM]+ ' ' +[Prenoms] as LBLPERSONNE FROM [dbo].[PERSONNE] WHERE [dbo].[PERSONNE].[ID_AUTO] = [dbo].[REGLEMENT].[ID_SIM]) as Client,
      (SELECT LBLSOCIETET FROM SOCIETE) as lblSociete,
    --ECT [NOM]+ ' ' +[Prenoms] as LBLPERSONNE  FROM [dbo].[PEPRESENTANT_ADMIN] WHERE [dbo].[PEPRESENTANT_ADMIN].[ID_AUTO] =  (SELECT Id_Caissier FROM [dbo].[REGLEMENT] WHERE [dbo].[REGLEMENT].[ID_AUTO] = (SELECT ID_AUTO FROM [dbo].[REGLEMENT])))as Caissier,
     (SELECT [NOM]+ ' ' +[Prenoms] as LBLPERSONNE FROM [dbo].[PERSONNE] WHERE [dbo].[PERSONNE].[ID_AUTO] = (SELECT ID_PERSONNE 
       FROM [dbo].[SIM] WHERE [dbo].[SIM].[ID_AUTO] = [dbo].[REGLEMENT].[ID_SIM])) as Client,
      (SELECT @dateA) as DateA,
      (SELECT @dateB) as DateB,
     (SELECT [NOM]+ ' ' +[Prenoms]  FROM [dbo].[PEPRESENTANT_ADMIN]  WHERE [dbo].[PEPRESENTANT_ADMIN].[ID_AUTO] =  @IdDepot) as Caissier
     
      FROM [dbo].[REGLEMENT]
      WHERE [dbo].[REGLEMENT].[DTEOP] BETWEEN @dateA and (@dateB + 1) and [dbo].[REGLEMENT].[Id_Caissier] = @IdDepot GROUP BY [dbo].[REGLEMENT].[ID_SIM],[dbo].[REGLEMENT].[Id_Caissier]
    Merci de m'aider SVP

  2. #2
    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,

    Pouvez vous nous donner la commande avec laquelle vous appelez la Procédure.

    Pouvez vous également nous indiquer le type de la colonne [dbo].[REGLEMENT].[DTEOP]

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 193
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    Pouvez vous nous donner la commande avec laquelle vous appelez la Procédure.

    Pouvez vous également nous indiquer le type de la colonne [dbo].[REGLEMENT].[DTEOP]

    Merci beaucoup

    TABLE REGLEMENT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ID_AUTO	int	Unchecked
    REF_REGLEMENT	varchar(15)	Unchecked
    DTEOP	datetime2(7)	Checked
    ID_OPENCAISSE	int	Checked
    ID_SIM	int	Unchecked
    MTTREGLEMENT	decimal(18, 3)	Checked
    IS_VALIDER	bit	Checked
    IS_COMPTABILISER	bit	Checked
    IS_ARCHIVER	bit	Checked
    Id_Caissier	int	Checked
    is_annuler	bit	Checked
    		Unchecked

    Le type de DTEOP est datetime2(7)

  4. #4
    Invité
    Invité(e)
    Par défaut
    C'est ça qui ne passe plus : @dateB + 1.
    Il faut faire ça plus littéralement genre dateadd(day, + 1, @dateB )

    Entre nous, il serait temps que tu apprennes à faire des jointures comme du monde avec INNER JOIN au lieu de pondre ce genre de requête immonde.
    Dernière modification par Invité ; 19/11/2013 à 15h38.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 193
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
    C'est ça qui ne passe plus : @dateB + 1.
    Il faut faire ça plus littéralement genre dateadd(day, + 1, @dateB )

    Entre nous, il serait temps que tu apprennes à faire des jointures comme du monde avec INNER JOIN au lieu de pondre ce genre de requête immonde.

    Merci beaucoup
    Mais quand j'enlève le (+1) ça me dire la même chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    USE [MSELLER]
    GO
     
    DECLARE	@return_value int
     
    EXEC	@return_value = [dbo].[ETAT_RAPPORT_VENTE_PERIODE_EVD]
    		@IdDepot = 3,
    		@dateA = N'01/10/2010',
    		@dateB = N'31/12/2013'
     
    SELECT	'Return Value' = @return_value
     
    GO

  6. #6
    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
    Votre format de date doit différer entre les deux serveurs.

    Vous pouvez faire un SET DATEFORMAT dmy,

    Mais vous devriez plutot utiliser le format iso suivant pour spécifier vos datetime en entrèe de procédure stockée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    EXEC	@return_value = [dbo].[ETAT_RAPPORT_VENTE_PERIODE_EVD]
    		@IdDepot = 3,
    		@dateA = N'20101001',
    		@dateB = N'20131231'
    Ainsi, plus de souci quel que soit le format de date paramétré pour l'instance sur laquelle cette commande s’exécute

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 193
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Votre format de date doit différer entre les deux serveurs.

    Vous pouvez faire un SET DATEFORMAT dmy,

    Mais vous devriez plutot utiliser le format iso suivant pour spécifier vos datetime en entrèe de procédure stockée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    EXEC	@return_value = [dbo].[ETAT_RAPPORT_VENTE_PERIODE_EVD]
    		@IdDepot = 3,
    		@dateA = N'20101001',
    		@dateB = N'20131231'
    Merci
    ça marche avec ce format sur le serveur. Mais mon inquiétude est comment faire pour mettre les valeurs de mon DatePTimePicker (C#) sous ce format?
    Ainsi, plus de souci quel que soit le format de date paramétré pour l'instance sur laquelle cette commande s’exécute

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 837
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 837
    Points : 52 922
    Points
    52 922
    Billets dans le blog
    5
    Par défaut
    (@dateB + 1)
    N'est plus autorisé avec un type DATETIME2.
    Ajouter un entier à une date était une facilité imbécile de la version DATETIME !
    Vous devez utilisez la fonction DATEADD.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Pour étoffer ce que disait 7gyY9w1ZY6ySRgPeaefZ, on peut établir un standard de codage et le suivre pour éviter d'écrire des requêtes illisibles, mais probablement aussi plus performantes.

    En suivant le standard de codage auquel je suis habitué, j'obtiens :

    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
    ALTER PROCEDURE dbo.ETAT_RAPPORT_VENTE_PERIODE_EVD
    	@IdDepot int
    	, @dateA datetime
    	, @dateB datetime
     
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	SELECT		ID_SIM
    			, Id_Caissier
    			, SUM(R.MTTREGLEMENT) AS Montant
    			, SOC.LBLSOCIETET AS lblSociete
    			, P.NOM + ' ' + P.Prenoms AS Client
    			, @dateA AS DateA
    			, @dateB AS DateB
    			, C.Caissier
    	FROM		dbo.REGLEMENT AS R
    	INNER JOIN	dbo.SOCIETE AS SOC
    				ON R.??? = SOC.???
    	INNER JOIN	dbo.PERSONNE AS P
    				ON P.??? = R.???
    	INNER JOIN	dbo.SIM AS S
    				ON S.ID_AUTO = R.ID_SIM
    	CROSS JOIN	(
    				SELECT	NOM + ' ' + Prenoms
    				FROM	dbo.REPRESENTANT_ADMIN 
    				WHERE	ID_AUTO =  @IdDepot
    			) AS C (Caissier)
    	WHERE		R.DTEOP BETWEEN @dateA AND DATEADD(day, 1, @dateB)
    	AND		dbo.REGLEMENT.Id_Caissier = @IdDepot
    	GROUP BY	R.ID_SIM, R.Id_Caissier
    END
    Je ne dis pas que vous devez adopter ce standard de codage : c'est celui sur lequel les développeurs de mon entreprise et moi nous sommes accordés. Peut-être est-il temps d'en établir un avec votre équipe

    Ainsi dans votre requête, on voit tout de suite qu'il y a de nombreux SELECT inutiles, qu'il manque des noms de tables ou leurs alias, et surtout qu'il manque des prédicats de jointure. Souvenez-vous aussi que vous pouvez aliaser le nom des tables, ce qui simplifie l'écriture des requêtes. Vous pouvez établir un trigramme par table, dans le nom de la table, comme SQLPro le fait dans ses exercices.

    Enfin les crochets sont totalement inutiles dans votre cas, puisque vous respectez les conventions de nommages de la norme SQL (pas d'espaces, pas de caractères de ponctuation, cabalistiques et autres bizarreries )

    Vous noterez qu'il est probable que vous puissiez récupérer le nom du caissier séparément de la requête principale, ce qui devrait simplifier votre plan d'exécution : un produit cartésien (CROSS JOIN ou comme vous l'avez exprimé) est généralement peu performant.

    @++

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 193
    Points : 89
    Points
    89
    Par défaut
    Grand Merci @elsuket pour les réponses et surtout pour les conseils.
    Je vais tester et vous fais le point.

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 193
    Points : 89
    Points
    89
    Par défaut
    Merci pour tout

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/12/2009, 11h19
  2. Réponses: 2
    Dernier message: 11/05/2009, 20h18
  3. Syntax error converting character string to smalldatetime data type.
    Par Anthony.Desvernois dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/07/2007, 17h26
  4. Réponses: 1
    Dernier message: 28/05/2007, 09h52
  5. [SQL Server] Error converting data type varchar...
    Par Sir Tengu dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 13/06/2003, 10h46

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