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 :

Un format de Date compliqué ! DATETIME, TIMESTAMP, DATE ?


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2011
    Messages : 39
    Points : 27
    Points
    27
    Par défaut Un format de Date compliqué ! DATETIME, TIMESTAMP, DATE ?
    Bonjour et merci d'avance pour votre aide,

    Avant tout, Je précise que je simplifie le problème pour une meilleur compréhension :

    Alors, je me trouve dans une impasse. J'ai une base de données SQL Server 2008 dans laquelle se trouve une table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE TableDate (
    	ID int NOT NULL,
    	DATE1 date NULL,
    	DATE2 date NULL,
    	DATE3 date NULL)
    Pour entrer des données dans cette table, j'ai comme point d'entré un fichier CSV que je ne peux pas toucher. A titre d'exemple je vous pose la première ligne de ce fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    123;01/09/11 00:00:00,000000000;15/09/11 00:00:00,000000000;20/09/11 00:00:00,000000000
    Pour insérer les lignes de ce fichier dans ma table j'utilise le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BULK INSERT TableDate
    FROM 'c:\Scripts SQL\export.csv'
    WITH
    (
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '\n',
    FIRSTROW = 2,
    DATAFILETYPE = 'char'
    )
    GO
    Enfin l'erreur retournée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 4864, Level 16, State 1, Line 2
    Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1, column 2 (DATE1).
    J'ai bien compris que le problème venait de la date. Le type date n'accepte pas la complexité de '15/09/11 00:00:00,000000000'. J'ai donc essayé les autres types :
    - datetime : marche pas
    - timestamp : marche pour DATE1 et le problème se décale à DATE2. Si je mets tout en timestamp, une erreur me dit que je n'ai droit qu'à un seul timestamp.

    Je suis donc bloqué. Je pense que la solution serai de pouvoir, à la création de la base, préciser le format de la date qui va être passé lors de l'INSERT. un format de type jj/mm/aa hh:mm:ss,ms

    Quelqu'un peut-il m'aider ?

    Merci

  2. #2
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Dans mes souvenirs le BULK fonctionne également avec un fichier .fmt qui permet de définir le format d'entrée du fichier.. a voir de ce côté peut-être.
    Sinon, SSIS c'est bien aussi pour faire de l'insert de masse.

  3. #3
    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
    Citation Envoyé par Amarox Voir le message
    Bonjour et merci d'avance pour votre aide,

    Avant tout, Je précise que je simplifie le problème pour une meilleur compréhension :

    Alors, je me trouve dans une impasse. J'ai une base de données SQL Server 2008 dans laquelle se trouve une table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE _TableDate (
    	ID int NOT NULL,
    	DATE1 date NULL,
    	DATE2 date NULL,
    	DATE3 date NULL)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    123;01/09/11 00:00:00,000000000;15/09/11 00:00:00,000000000;20/09/11 00:00:00,000000000
    Pour insérer les lignes de ce fichier dans ma table j'utilise le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BULK INSERT TableDate
    FROM 'c:\Scripts SQL\export.csv'
    WITH
    (
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '\n',
    FIRSTROW = 2,
    DATAFILETYPE = 'char'
    )
    GO
    D'abord tu as _TableDate comme table et tu fais une insertion dans TableDate

    Mais le vrai problème c'est que tes colonnes sont de type DATE et veux insérer une valeur du genre 01/09/11 00:00:00,000000000
    Lis ceci

    au fait la virgule qu'il y a là représente quoi ? une date c'est au format AAAA-MM-JJ

    Si tu es dans l'urgence alors créer une table temporaire en remplaçant les types DATE par varchar (50) et charge les données du fichier dans cette table temporaire et après tu te débrouille pour charger la table TableDate avec quelque du genre et des CAST, SUBSTRING , ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO TableDate (ID,DATE1,DATE2,DATE3)
    SELECT ..... FROM TableTemporaire

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2011
    Messages : 39
    Points : 27
    Points
    27
    Par défaut
    Merci,

    Je dois finir ce point demain soir, ordre du chef ! Je suis chez moi la, j'ai bien lu vos posts, je reviens vers vous des demain.

    Bonne soiré, merci encore

  5. #5
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Le ne fonctionne pas avec BULKINSERT?

    Jamais essayé...

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2011
    Messages : 39
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par zinzineti Voir le message
    D'abord tu as _TableDate comme table et tu fais une insertion dans TableDate
    Merci j'ai corrigé,

    Mais le vrai problème c'est que tes colonnes sont de type DATE et veux insérer une valeur du genre 01/09/11 00:00:00,000000000
    au fait la virgule qu'il y a là représente quoi ? une date c'est au format AAAA-MM-JJ
    Le fichier CSV est un extract d'une base oracle. Je pense que les zéro après la virgule sont les millisecondes.

    Sinon, je poursuit les tests sur fichier .fmt et SET DATEFORMAT='ymd'

    merci à vous

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    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 865
    Points : 53 018
    Points
    53 018
    Billets dans le blog
    6
    Par défaut
    Essayez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE tmp_TableDate (
    	ID int NOT NULL,
    	DATE1 NVARCHAR(60) NULL,
    	DATE2 NVARCHAR(60) NULL,
    	DATE3 NVARCHAR(60) NULL);
    GO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BULK INSERT tmp_TableDate
    FROM 'c:\Scripts SQL\export.csv'
    WITH
    (
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '\n',
    FIRSTROW = 2,
    DATAFILETYPE = 'char'
    )
    GO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SET DATEFORMAT DMY;
     
    INSERT INTO TableDate (ID, DATE1, DATE2, DATE3)
    SELECT ID, REPLACE(DATE1, ',', '.'), REPLACE(DATE2, ',', '.'), REPLACE(DATE3, ',', '.'), 
    FROM    tmp_TableDate
    GO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DROP TABLE tmp_TableDate
    A +

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2011
    Messages : 39
    Points : 27
    Points
    27
    Par défaut
    SQL Pro, merci pour ton aide, c'est vrai que le plus important était de modifier le champ date pour que SQL Server comprenne le format.

    Je cherchais trop à résoudre le problème coté insertion alors que c'était plus simple de modifier le select qui créé le CSV. J'ai donc contacté la personne qui me fournissé le CSV en lui demandant d'appliquer pour chaque champ la logique suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
    	ID int NOT NULL,
     
    	SUBSTR(DATE1,7,2)||
    	SUBSTR(DATE1,4,2)||
    	SUBSTR(DATE1,1,2) as DATE1,
     
    	...
     
    FROM
            TableDate
    Merci à tous pour votre participation, je suis sur que les codes sql me serviront pour une autre fois.

    Bonne semaine

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

Discussions similaires

  1. [2008] Format date convert(datetime)
    Par BIOoOAG dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/11/2014, 16h30
  2. Format Date et DateTime
    Par keryss dans le forum ADO.NET
    Réponses: 5
    Dernier message: 06/03/2011, 10h26
  3. Réponses: 4
    Dernier message: 29/01/2008, 16h01
  4. Formater une date via un timestamp UNIX et un modèle modifiable
    Par Aldéhir dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 7
    Dernier message: 11/09/2007, 16h43
  5. Réponses: 2
    Dernier message: 21/03/2007, 16h06

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