Requête SQL : date au format américain

Résolu
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 - 8 févr. 2008 à 10:00
pneau Messages postés 258 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 27 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

7 réponses

pneau Messages postés 258 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 27 octobre 2010 5
8 févr. 2008 à 10:43
salut,
essaie, dans ta requete, d'utiliser la fonction "CONVERT", elle te permet de récupérer une chaine formattée suivant ce que tu désire

ex
select convert(varchar(10),getdate(),103) te donnera 08/02/2008
select convert(varchar(10),getdate(),112) te donnera 20080208

la doc précise sur CONVERT est ici

cordialement

Pat

 Don't Worry , Be Happy

<hr />lorsque le problème est résolu, pensez Réponse Acceptée
2
pneau Messages postés 258 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 27 octobre 2010 5
8 févr. 2008 à 14:21
re,
tu as quoi comme donnée dans la base et tu as quoi comme résultat ?

Pat

 Don't Worry , Be Happy

<hr />lorsque le problème est résolu, pensez Réponse Acceptée
1
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
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
1
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
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
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
8 févr. 2008 à 14:10
Je l'avais déjà essayé, mais par acquis de conscience, j'ai recommencé :

Quand je fais un
SELECT convert(varchar(10),DateOuverture,103) FROM MaTable ...
La date remontée n'est pas bonne.

J'avoue que là, je commence à ne plus trop avoir de cheveux ^^

Molenn
0
pneau Messages postés 258 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 27 octobre 2010 5
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
0
pneau Messages postés 258 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 27 octobre 2010 5
8 févr. 2008 à 15:54
ben tant pis alors...
si un jour tu trouves l'explication... n'hésites pas à partager...
courage... la force est avec toi...
@+

Pat

 Don't Worry , Be Happy

<hr />lorsque le problème est résolu, pensez Réponse Acceptée
0
Rejoignez-nous