2009-10-30 5 views

Répondre

25

Il fait deux choses ici qui ne correspondent pas à vos attentes, je pense: En supposant que vous voulez la semaine avec Jan 1 dans la semaine 1, et en utilisant le dimanche comme premier jour de la semaine Il a donc la semaine 1 allant du dimanche 28 décembre 2008 au samedi 3r d Jan 2009.

La semaine 6 commencerait le dimanche 1er février par cette méthode.

La norme ISO est pour la semaine 1 celle contenant 4 jours de janvier ou le premier jeudi de l'année (différentes façons d'exprimer la même chose). Vous pouvez spécifier cette méthode de calcul et le premier jour de la semaine:

Format(SomeDate,"ww",vbMonday,vbFirstFourDays) 

voir ici la syntaxe:

https://support.office.com/en-US/article/Format-Function-6F29D87B-8761-408D-81D3-63B9CD842530

+0

+1, ceci est la réponse complète. J'espère que cela ne vous dérange pas le montage cosmétique. –

+0

Pas du tout, et j'ai maintenant mis à jour mes informations de profil ainsi j'ai un nom propre (je viens de passer par superuser.com et je me suis inscrit pour répondre à celui-ci) – AdamV

+0

http://www.rondebruin.nl /isodate.htm est une autre bonne référence pour ISO –

5

Cela pourrait fonctionner: Format (YourDate, "ww", vbMonday)

+0

oh, je vois. Merci Sosh. Il * fonctionne * maintenant :-P –

+0

@Sosh: Je suis curieux de voir ce que le PO attend pour 01/05/09 (5 janvier 09)? Je pense que OP pourrait s'attendre à ce que le 5 janvier soit la semaine 1 alors que ce sera la semaine 2 selon votre exemple. – shahkalpesh

+0

Il existe également un premier argument d'une semaine pour la fonction de formatage: vbUseSystem, vbFirstJan1, vbFirstFourDays, vbFirstFullWeek – Fionnuala

2

"résultat correct" dépend des paramètres régionaux. Peut-être que VBA vous laissera choisir un système de calendrier, sinon vous n'avez pas vraiment de chance.

Notez que First-On-xxDay n'est pas votre seul problème. Il y a aussi une variation sur ce qu'est une semaine complète Semaine 1 dans un système pourrait être Semaine 53 de l'année précédente dans un autre système.

Donc, testez bien et ne vous laissez pas séduire par «corriger de 1».

+0

merci. A propos de votre note: le numéro de la semaine, pour moi, n'est pas critique. Il seulement * accompagner * un champ de date. –

0

Si dimanche est le premier jour de la semaine (comme dans certains endroits), puis 6 est la Semaine n ° correct " 1/2/2009 "(1er février 2009)

5

Quel que soit le jour de la semaine votre semaine, vous besoin de transmettre des valeurs de date non ambiguës. "31/1/2009" ne peut être qu'une date (31 janvier), mais "1/2/2009" pourrait être le 2 janvier (style US) ou 1er février (tout le monde qui a plus de sens que nous USAns).

Dans ce cas, j'utiliser DateSerial() pour vous assurer que la date ne soit pas mal interprété:

Format(DateSerial(2009,2,1), "ww", vbMonday) 

Bien que cela ne cause pas votre problème, car Access utilise obligeamment les paramètres de date localisés de votre système, je pense que c'est quelque chose que tu devrais faire de toute façon. Vous êtes certainement obligé de le faire dans SQL dans Access, donc je ne pense pas que ce soit une mauvaise habitude dans le code et les expressions.

+0

Merci David. Je garderai ça à l'esprit. –

1

J'ai eu le même problème.

Il a montré la semaine 53 et la semaine 1, mais jour en semaine 53 et la semaine 1 sont tous dans la semaine 1

J'ai d'abord essayé de changer le format de date dans la requête d'accès à ceci:

OrderWeek: Format ([OrderDate], "yyyy-ww", 1,3) < - Mais ça n'a pas marché. Vous obtenez des dates comme 2014-52 pour la semaine 52 et 2015-52 où c'était la semaine précédente.

Aussi le tri n'était pas comment j'ai aimé. Il a trié les données comme 2014-1, 2014-11, 2014-2 etc. Je veux qu'il montre comme 2014-01, 2014-02 .. 2014-11 etc.

Alors voici le nouveau code à afficher à la fois l'année et la semaine correctement dans une requête d'accès:

ActualWeek: IIf(DatePart("ww",[SomeDate])=53,DatePart("yyyy",[SomeDate])+1,DatePart("yyyy",[SomeDate])) & "-" & IIf(DatePart("ww",[SomeDate])=53,"01",IIf(DatePart("ww",[SomeDate])<10,"0" & DatePart("ww",[SomeDate]),DatePart("ww",[SomeDate]))) 

Cela montre maintenant tous les jours de la semaine 53 comme faisant partie de la semaine 1

Questions connexes