Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 2011
-
8 févr. 2008 à 10:00
pneau
Messages postés258Date d'inscriptionmercredi 21 avril 2004StatutMembreDernière intervention27 octobre 2010
-
8 févr. 2008 à 15:54
Bonjour,
J'ai longtemps hésité entre le forum VB et celui SQL ... J'espère avoir fait le bon choix
Je pose vite fait mon problème :
Une base SQL Server sur un serveur distant. Une des innombrables tables contient entre autre une date (date d'ouverture d'un dossier). Lorsque je tente d'extraire via VBA cette date, je l'obtiens au format américain (c'est à dire mm/dd/yyyy) dans mon fichier Excel, mais Excel lui, considère le résultat comme un format européen (soit dd/mm/yyyy).
En résumé, j'extrais une date qui est le 07/02/2008 et j'obtiens dans mon fichier 02/07/2008.
J'ai été voir sur le serveur, via un accès TS et l'analyseur de requête : les dates quand je consulte la table sont stockées sous la forme dd/mm/yyyy hh:mm
Je n'ai pas accès au panneau de config du serveur, mais je suppose donc que les paramètres régionaux sont français.
Les paramètres sur mon poste sont français eux aussi.
Lorsque je tente d'extraire à partir de mon fichier Excel :
En VBA donc, via la création d'un aobjet ADO et donc d'un Recordset, ça ne fonctionne plus.
Ce que je fais :
SQL = "SELECT DateOuverture FROM MaTable WHERE Dossier='xxxxx'"
Code d'ouverture du recordset, etc ...
Je lis le contenu de mon recordset : Rs.field("DateOuverture ").value et là, la date est 02/07/2008
J'ai essayé d'appliquer plein de format à mon résultat (entre autre Format("dd/mm/yyyy", rs.field ...), ça ne fonctionne pas. Extraire le mois de mon résultat, mais : month(rs.field...) = 7 et non 2 comme ça devrait l'être.
Par contre, si je modifie ma requête SQL de la façon suivante :
SQL = "SELECT month(DateOuverture) FROM MaTable WHERE Dossier='xxxxx'"
Quand j'interroge le recordset, j'obtiens bien en résultat 2 pour le mois de février.
1° Si quelqu'un pouvait m'expliquer ce mystère, merci
2° Pour résoudre mon pb, je pense qu'il faut que je modifie donc le contenu de ma requête SQL (ce qui explique pourquoi je poste ici plutôt que sur le forum VB)
Je ne peux pas faire
SQL = "SELECT day(DateOuverture),month(DateOuverture),year(DateOuverture) FROM MaTable WHERE Dossier='xxxxx'"
Ca ne m'arrange pas, j'ai fini mon programme, et insérer des colonnes supplémentaires (j'ai 3 dates dans le même cas) me ferait reprendre trop de choses
J'ai bien essayé de faire un day(DateOuverture)+'/'+month(DateOuverture)+"/"+year(DateOuverture) pour reconsituer la date dans un seul champ, mais ça ne fonctionne pas. Sans doute parce que le type de champ est Date/heure et que le résultat de mes fonctions sont des Entiers.
J'ai aussi essayé de bricoler avec des Convert et Cast, mais Convert(datetime,DateOuverture,103) ne fonctionne pas et me sort continuellement un 02/07/2008.
J'avoue que je sèche et n'étant pas très doué en SQL Server (j'apprends sur le tas, aucune formation, donc, vive google et l'aide en ligne), je ne vois pas comment rédiger ma requête pour obtenir ce que je veux.
J'espère n'avoir pas été trop brouillon dans mes explications, et merci d'avance à qui m'aidera à résoudre mon problème.
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 8 févr. 2008 à 15:09
Quand je vais voir dans la table (par Entreprise Manager sur le serveur), je crée une requête toute simple :
SELECT DateOuverture FROM MaTable WHERE Num='xxx'
La réponse affichée est :
01/02/2007 08:23:58
(j'ai changé de dossier, mais le principe est le même ^^)
Maintenant, via mon fichier EXCEL, après récupération dans un recordset, j'affiche :
SELECT convert(varchar(10),DateOuverture,103) FROM MaTable
=> 02/01/2007
Par contre, j'ai vu ça par hasard, en testant tout et n'importe quoi pour voir, si au lieu de prendre comme la logique le voudrait 103 pour le format européen, je prends 110 (qui est le format US), j'obtiens :
SELECT convert(varchar(10),DateOuverture,110) FROM MaTable
=> 01/02/2007
qui est le résultat que je veux obtenir O_o
Par curiosité, le test avec tous les codes
101 : 01/02/2007 USA Ok
102 : 2007.02.01 ANSI Ok
103 : 02/01/2007 Anglais/Français Nok
104 : 01.02.2007 Allemand Ok
105 : 02/01/2007 Italien Nok
110 : 01/02/2007 USA Ok
111 : 01/02/2007 Japon Ok
112 : 20070201 Iso Ok
113 : 01 févr 20 Valeur par défaut Europe Ok (pas tout l'affichage car varchar(10)
Pourquoi l'Allemand correspond bien à ce qu'il est sensé remonter, et pas l'italien et le français ?
Pourquoi les codes USA me remontent ce que j'attends, à l'inverse de ce qu'ils sont sensés me remonter ?
Pourquoi le Japon ne remonte pas ce qu'il devrait ?
J'avoue que je suis très perplexe sur le pourquoi de la chose. Je vais coller avec le code 100 dans mon programme puisqu'à apparemment, ça fonctionne, mais j'avour qu'intellectuellement parlant, c'est pas satisfaisant du tout.
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 8 févr. 2008 à 15:42
Sur mon poste, mes paramètres régionaux :
Date courte : jj/MM/aaaa
Date longue : jjjj j MMMM aaaa
Langue : français (france)
Tout m'a l'air correct.
J'attaque directement la base de données d'une appli qu'on utilise, et dans l'appli, la date est bien 01/02/2007 08:23:58
Donc, à priori, ce n'est pas un pb d'interprétation de ma part (mais je reconnais que j'y ai pensé moi aussi :p)
Il me reste un problème : Je ne sais pas et je ne peux pas savoir quels sont les paramètres régionaux du serveur. Je ne vois plus que ça qui pourrait poser problème.
Mais bon, en mettant 110, ça fonctionne ... Je crois que je vais abandonner et me contenter de ça. Je n'ai pas beaucoup plus de temps à consacrer à ce projet.
Oui oui, j'avais vérifié avec des dates supérieures au 12 (j'ai 4 ans de données à disposition), en fait, mon programme est terminé depuis mi janvier et à cette période là, tout fonctionnait nickel. On m'a remonté le bug début février. Je n'avais pas fait attention avant à ce problème de date (surtout que dans mon code VB, j'avais pourtant pris la précaution d'encadrer ma date d'un Format("dd/mm/yyyy", Date) ...).
Les joies et les mystères de l'informatique ^^
Molenn
Vous n’avez pas trouvé la réponse que vous recherchez ?
pneau
Messages postés258Date d'inscriptionmercredi 21 avril 2004StatutMembreDernière intervention27 octobre 20105 8 févr. 2008 à 15:26
et si tu lance la requete dans un analyser de requete (isqlw par ex), cela donne quoi ?
as tu vérifier tes formats dates courtes et dates longues dans les param régionaux ?
as tu vérifier la langue sélectionnée de ton windows par défaut ?a mon avis cela vient de ton poste car il n'y a aucune raison qu'il ne te renvoie pas ce qu'il faut. a moins que ce soit la donnée de te table qui est inversée ? ex tu as 01/02/2007 et tu penses que 01 JJ, 02 MM et 2007 = AAAAalors que peut être c'est 01 MM, 02 JJ et 2007 = AAAA.
dans ce cas, la fonction ne foncionne pas "à l'envers". As tu moyen de vérifier avec des données de ta table dont le jour est > 12 ?
Pat
Don't Worry , Be Happy
<hr />lorsque le problème est résolu, pensez Réponse Acceptée