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 :

Erreur conversion d'un type de données varchar en type de données datetime


Sujet :

Développement SQL Server

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Erreur conversion d'un type de données varchar en type de données datetime
    Bonjour voici une nouvelle facétie de SQL Serveur version Française

    Je viens de chercher pendant un bon bout de temps pourquoi une requete qui fonctionne tres bien chez moi me donne un message d'erreur chez un utilisateur en France

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT 
    *
    FROM 
    Stock
    WHERE DateIN >= '2012-01-18'
    Citation Envoyé par ErrorMessage
    Msg*242, Niveau*16, État*3, Ligne*2
    La conversion d'un type de données varchar en type de données datetime a créé une valeur hors limites.
    Et je viens de découvrir l'HORREUR !
    La requete sur Date est dépendante du type d'installation du serveur !!

    Le serveur de l'utilisateur est installé en Français !

    Il faut alors faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE DateIN >= '18-01-2012'
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE DateIN >= '2012-01-18'
    Je pense et j'espère qu'avec une requete parametrée je devrais m'en sortir
    Mais je trouve cependant cela horrible !!

    J'ose a peine imaginer ce que doit donner un Back-Up restore entre les deux serveurs dans ce cas !!

    Vos remarque sur mon interpretation de ce problème sont les bienvenues
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  2. #2
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Bonjour,

    Le format de la date dépend en effet de la langue utilisée pour l'installation.

    Pour voir la liste des différents formats par langue installée:
    Pour le francais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sp_helplanguage 'French'
    Pour modifier le comportement de la session, vous pouvez utiliser la commande suivante par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET DATEFORMAT ymd
    Pour plus d'information, cette commande et le comportement que vous décrivez sont expliqués dans la MSDN

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par olibara Voir le message
    Bonjour voici une nouvelle facétie de SQL Serveur version Française
    Il ne s'agit pas d'une facétie, mais d'un comportement attendu et normatif.

    Le format normatif de conversion de STRING en DATETIME dans SQL Server repose sur la norme SQL qui imposait le format 'AAAAMMJJ hh:mm:ss.nnn'
    Ceci jusqu'à la norme SQL1999.

    Quelque soit les règles du serveur, ce format passe outre le paramétrage de langue.

    A partir de SQL Server 2008, qui a rajouté les type DATE, DATETIME2 et DATETIMEOFSSET, le format normatif ayant évolué, SQL Server prends désormais 'AAAA-MM-JJ ...' UNIQUEMENT pour les nouveaux types (afin de rester rétrocompatible).

    Si vous aviez cherché un peu, vous seriez tombé sur l'article que nous avons écrit à ce sujet :
    http://baptiste-wicht.developpez.com...-sql/datetime/

    Effectivement le paramétrage SET FORMAT permet de prendre en compte des format exotique de conversion STRING DATE.

    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/ * * * * *

  4. #4
    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
    Ou sinon, toujours écrire une date avec la fonction CONVERT, comme ça plus jamais de problème de localisation.

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci a tous !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Bonjour

    A la suite de ce Post J'avais cru comprendre que le format d'interpretation generique d'une date etait

    Je je decouvre que l'import export wizard n'aime pas du tout cela et qu'il exige
    En résumé la regle depends toujours du contexte !!
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  7. #7
    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
    Je me permets de m'auto-citer :
    Citation Envoyé par Waldar Voir le message
    Ou sinon, toujours écrire une date avec la fonction CONVERT, comme ça plus jamais de problème de localisation.

  8. #8
    Membre averti
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par olibara Voir le message
    Bonjour
    Je je decouvre que l'import export wizard n'aime pas du tout cela et qu'il exige
    En résumé la regle depends toujours du contexte !!
    Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    convert(datetime, '2012-02-22 01:02:03', 121)

  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Seguei

    Mais je cherche le format me permettant de faire un import a l'aide de l'import / export Wizard (j'ai +/- 400.000 rows a importer)

    yyyy-MM-dd fonctionne pour les dates ayant une valeur
    Par contre si je laisse le champ vide pour une date nulle j'ai une erreur de conversion

    Je cherche encore
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  10. #10
    Membre averti
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par olibara Voir le message
    Merci Seguei

    Mais je cherche le format me permettant de faire un import a l'aide de l'import / export Wizard (j'ai +/- 400.000 rows a importer)

    yyyy-MM-dd fonctionne pour les dates ayant une valeur
    Par contre si je laisse le champ vide pour une date nulle j'ai une erreur de conversion

    Je cherche encore
    Es tu sûr que le pb est dans une valeur vide ? Ce code fonctionne correctement en 2008.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
      convert(datetime, src_date, 121)
    FROM
      (SELECT '2012-02-22 01:02:03' AS src_date
      UNION ALL 
      SELECT '' AS src_date
      UNION ALL 
      SELECT NULL AS src_date) t
    Il est probable, que t'a des valeurs comme '9999-99-99' plutôt.

  11. #11
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Serguei

    Mais je parle maintenant d'un probleme de format de date non pas dans une commande SQL mais lors de l'usage de l'import / export Wizard

    Une date ayant une valeur se presente dans une colonne tab délimitée

    \t20120221\t

    et nulle c'est

    \t\t

    Mais il semble que l'import export Wizard ne puisse pas traiter les valeurs vides !!
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  12. #12
    Membre averti
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par olibara Voir le message
    Merci Serguei

    Mais je parle maintenant d'un probleme de format de date non pas dans une commande SQL mais lors de l'usage de l'import / export Wizard

    Une date ayant une valeur se presente dans une colonne tab délimitée

    \t20120221\t

    et nulle c'est

    \t\t

    Mais il semble que l'import export Wizard ne puisse pas traiter les valeurs vides !!
    Pour moi "Import wizard" traite correctement les valeurs vides entre les tabulations.
    Voir PJ : le fichier source et la capture d’écran.
    Sinon essaie BCP.
    Fichiers attachés Fichiers attachés

  13. #13
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Serguei

    Tu utilise 2005 ou 2008 ?
    J'ai lu qu'en 2008 le comportement avait changé

    En tout cas j'ai contourné en mettant une valeur sentinelle et par apres je fais un update
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  14. #14
    Membre averti
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par olibara Voir le message
    Merci Serguei

    Tu utilise 2005 ou 2008 ?
    J'ai lu qu'en 2008 le comportement avait changé

    En tout cas j'ai contourné en mettant une valeur sentinelle et par apres je fais un update
    Effectivement, il y a un problème en Import Wizard qui est contournée par une colonne dérivée en SSIS mais au niveau Wizard 2005 il n'y pas de solution à ma connaissance.

    Alors, je te propose une méthode propre qui traite les valeurs vides comme "null" en 2005 et 2008.

    Il te faut un fichier de format en plus (voir PJ)
    Puis, on crée la table cible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE dbo.import_test (
      int_value int NOT NULL,
      date_value datetime NULL,
      str_value nvarchar(255) NULL
    )
    Enfin, on fait l'import
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    BULK INSERT dbo.import_test
    FROM 'P:\Temp\import_test.csv'
    WITH
    (
    	FORMATFILE = 'C:\Temp\import_test.xml',
    	ERRORFILE = 'C:\Temp\import_test.csv.err',
    	BATCHSIZE = 1000000,
    	CODEPAGE = 'ACP',
    	MAXERRORS = 1,
    	TABLOCK,
    	FIRSTROW = 1
    )
    Espérons que cela aide
    Fichiers attachés Fichiers attachés

  15. #15
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Serguei

    Intéressant je n'avais jamais utilisé le Bulk Insert
    C'est bon a connaitre
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  16. #16
    Membre du Club Avatar de tequillaman
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 112
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Il ne s'agit pas d'une facétie, mais d'un comportement attendu et normatif.

    Le format normatif de conversion de STRING en DATETIME dans SQL Server repose sur la norme SQL qui imposait le format 'AAAAMMJJ hh:mm:ss.nnn'
    Ceci jusqu'à la norme SQL1999.

    Quelque soit les règles du serveur, ce format passe outre le paramétrage de langue.

    A partir de SQL Server 2008, qui a rajouté les type DATE, DATETIME2 et DATETIMEOFSSET, le format normatif ayant évolué, SQL Server prends désormais 'AAAA-MM-JJ ...' UNIQUEMENT pour les nouveaux types (afin de rester rétrocompatible).

    Si vous aviez cherché un peu, vous seriez tombé sur l'article que nous avons écrit à ce sujet :
    http://baptiste-wicht.developpez.com...-sql/datetime/

    Effectivement le paramétrage SET FORMAT permet de prendre en compte des format exotique de conversion STRING DATE.

    A +

    Bonjour,
    J'ai le même problème pour importer les dates de excel vers sql 2005. Le liens que tu met dans ta réponse ne fonctionne plus.

  17. #17
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par olibara Voir le message
    Bonjour

    A la suite de ce Post J'avais cru comprendre que le format d'interpretation generique d'une date etait

    Je je decouvre que l'import export wizard n'aime pas du tout cela et qu'il exige
    En résumé la regle depends toujours du contexte !!
    Visiblement vous ne savez pas lir !

    A relire : http://www.developpez.net/forums/d11...e/#post6477616

    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/ * * * * *

Discussions similaires

  1. Erreur de conversion du type de données varchar en bigint
    Par lacigale dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/01/2013, 10h03
  2. [Débutant] Erreur de conversion du type de données varchar en float
    Par nanox dans le forum C#
    Réponses: 2
    Dernier message: 02/12/2011, 11h53
  3. Réponses: 1
    Dernier message: 21/02/2011, 21h30
  4. [AC-2007] Erreur conversion type de données
    Par Rapheux dans le forum IHM
    Réponses: 1
    Dernier message: 12/06/2010, 18h31
  5. erreur conversion type de données 3421
    Par sunwind dans le forum VBA Access
    Réponses: 1
    Dernier message: 05/05/2008, 16h27

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