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 :

Changer le format des dates dans une requête SQL


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Changer le format des dates dans une requête SQL
    Bonjour

    je voudrai pouvoir analyser un sql afin de modifier le format des dates

    je m'explique

    j'ai deux DB, une avec le format de date mm-dd-yyyy et l'autre avec le format de date dd-mm-yyyy.

    lorsque le programme génère un sql, avec des dates dedans, il fonctionne sur la Db source mais pas sur la DB de destination.
    les dates étant envoyées sans spécifier le format.

    Les changement nécessaire dans le programme vont prendre du temps, donc je voudrai faire un petit programme qui analyse les requête
    SQL, trouve celle où il-y-a une date et faire une insertion autour de la date avec 'convert(datetime,'

    sql d'origine :
    Insert into itemmains (ItemMainNumber,ColRoot,WSRoot,ItemMainCode ,ItemMainDateCreate, ItemMainDateModify )
    VALUES ( 2, 1, 1, '990003','30/09/2010','20/07/2012')

    SQl modifié
    Insert into itemmains (ItemMainNumber,ColRoot,WSRoot,ItemMainCode ,ItemMainDateCreate, ItemMainDateModify )
    VALUES ( 2, 1, 1, '990003',convert(datetime, '30/09/2010' , 103), convert(datetime, '20/07/2012' , 103))

    J'ai fait un premier sql qui me fait cette modif mais ça ne marche que quand toutes les dates sont identiques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    update tm_commands set tm_command = CASE WHEN len(v1date) > 0 THEN replace(convert(varchar(max),tm_command), v1date, 'convert(datetime,' + v1date + ',103)') ELSE tm_command END 
    From tm_commands
    inner join ( 
      select tm_id as v1id 
      , case WHEN convert(integer, patindex('%|[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]|%', tm_command)) >= 1 THEN substring(tm_command, patindex('%|[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]|%', tm_command), 12) ELSE '' END  as v1date 
      From tm_commands
      where tm_command like '%|[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]|%' 
      and tm_command not like '%datetime,|[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]%' 
    ) as v1 on v1.v1id = tm_id
    Auriez-vous une idée ou une sugestion pour résoudre ce problème?

    D'avance merci
    Tazze

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 218
    Points : 28 193
    Points
    28 193
    Par défaut
    Dans SQLServer, si tes champs sont de type DateTime, ils n'ont aucun format spécifique, donc toutes tes bases de données doivent avoir le même format.

    Pour ce qui est des requêtes, lorsque les dates sont passées sous forme de chaine de caractère sans qu'aucun format ne soit spécifié, le moteur de SQLServer attend une date au format américain (mm-dd-yyyy)

    Dans le cas contraire, il faut effectivement utiliser Convert pour que le moteur fasse une préconversion. Attention à utiliser le bon code de format, le code 103 correspond au format français avec l'année sur 4 chiffres à savoir jj/mm/aaaa.

    Si toutes tes dates sont de ce format là, tu peux utiliser le code 103, sinon il faudra l'adapter en fonction du format réellement passé.

    LE mieux, pour s'affranchir de cela, est d'utiliser des variables de type Datetime et des requêtes paramétrées

  3. #3
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Et en utilisant le format ISO AAAAMMJJ ?

    Exemple :
    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
    -- Ok
    SET LANGUAGE us_english;
    GO
    select COUNT(*) from Utilisateur where DateCreation < '20101231'
    GO
    -- Ok
    SET LANGUAGE french;
    GO
    select COUNT(*) from Utilisateur where DateCreation < '20101231'
    GO
    -- Erreur
    SET LANGUAGE us_english;
    GO
    select COUNT(*) from Utilisateur where DateCreation < '31/12/2010'
    GO
    -- Ok
    SET LANGUAGE french;
    GO
    select COUNT(*) from Utilisateur where DateCreation < '31/12/2010'
    GO

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Si tu sais dans quel format est ton fichier source il suffit d'insérer en tête du script si tu as mm/dd/yyyy
    ou
    si c'est dd/mm/yyyy
    Essaie et tu verras.

    A+
    Soazig

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Salut,

    c'est bon, j'ai utilisé 'set language' avant d'exécuter les query's qui posaient problème et ça marche.

    Merci pour cette solution ultra simple et diablement efficace.

    Tazze-99

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

Discussions similaires

  1. [AC-2002] modifier le format de date dans une requête
    Par tom@tom dans le forum VBA Access
    Réponses: 1
    Dernier message: 24/06/2009, 09h36
  2. Forcer le format des dates dans une cellule
    Par cchampion2fr dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/10/2008, 13h20
  3. Réponses: 5
    Dernier message: 28/12/2006, 15h41
  4. [SQL INTERBASE] format de date dans une requete sql
    Par arnolpourri dans le forum InterBase
    Réponses: 5
    Dernier message: 03/07/2006, 11h42
  5. Constante Date dans une requête SQL
    Par tarbala dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 25/04/2006, 16h24

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