2009-10-30 13 views
9

Przykłady:Uzyskaj numer tygodnia od podanej daty

'DD/MM/YYYY 
"1/1/2009" should give `1` 
"31/1/2009" should give `5` 
"1/2/2009" should also give `5` 

Format("1/2/2009", "ww") zostaje przywrócone 6.

Jak mogę uzyskać poprawny wynik?

+3

To zliczenie niedzielę jako pierwszy dzień tygodnia, a nie poniedziałek . – falstro

Odpowiedz

25

robi dwie rzeczy, które nie pasują do Twoich oczekiwań, myślę: Zakładając chcesz tydzień z 1 stycznia, jak w tygodniu 1, jak i korzystania z niedzieli Pierwszy dzień tygodnia Tak więc ma tydzień 1 od niedzieli 28 grudnia 2008 do soboty 3 dni d Jan 2009.

Tydzień 6 rozpocznie się w niedzielę 1 lutego tą metodą.

Norma ISO dotyczy pierwszego tygodnia, obejmującego 4 dni stycznia lub pierwszy czwartek roku (różne sposoby wyrażania tego samego). Możesz określić metodę obliczania i pierwszy dzień tygodnia:

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

zobaczyć tutaj składni:

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

+0

+1, to jest kompletna odpowiedź. Mam nadzieję, że nie masz nic przeciwko edycji kosmetycznej. –

+0

Wcale nie, a teraz otrzymałem informację o moim profilu, więc mam odpowiednią nazwę (właśnie wyskoczyłem z superuser.com i zapisałem się, aby odpowiedzieć na to pytanie) – AdamV

+0

http://www.rondebruin.nl /isodate.htm to kolejne dobre odniesienie dla ISO –

5

Może to działa: Format (YourDate, "WW", vbMonday)

+0

o, widzę. Dzięki Sosh. It * działa * teraz :-P –

+0

@Sosh: Jestem ciekawy, co OP oczekuje na 01/05/09 (5 stycznia 09)? Sądzę, że OP może oczekiwać, że 5 stycznia będzie tydzień 1, podczas gdy będzie to tydzień 2, jak na waszym przykładzie. – shahkalpesh

+0

Istnieje również argument firstweekofyear dla funkcji formatu: vbUseSystem, vbFirstJan1, vbFirstFourDays, vbFirstFullWeek – Fionnuala

2

"poprawny wynik" zależy od lokalizacji. Może VBA pozwoli ci wybrać system kalendarza, w przeciwnym razie nie masz szczęścia.

Pamiętaj, że First-On-xxDay nie jest Twoim jedynym problemem. Istnieje również wariacja na temat całego tygodnia tygodnia. Tydzień 1 w jednym systemie może być Tydzień 53 z poprzedniego roku w innym systemie.

Przetestuj więc dokładnie i nie daj się uwieść, aby "poprawić o 1".

+0

dzięki. O twojej notatce: numer tygodnia, dla mnie, nie jest krytyczny. Tylko * towarzyszy * polu daty. –

0

Jeżeli niedziela jest pierwszym dniem tygodnia (jak to jest w niektórych lokalizacjach), a następnie 6 jest poprawna weeknumber dla " 02.01.2009" (1 lutego 2009)

5

Niezależnie od dnia tygodnia Twój tydzień rozpoczyna się, ty trzeba przekazać jednoznaczne wartości dat. "31/1/2009" może być tylko jedną datą (31 stycznia), ale "1/2/2009" może być 2 stycznia (amerykański styl) lub 1 lutego (wszyscy, którzy mają więcej sensu niż my USAns).

W tym przypadku użyłbym DateSerial(), aby upewnić się, że data nie jest błędnie interpretowane:

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

Chociaż nie jest przyczyną problemu, ponieważ dostęp usłużnie wykorzystuje zlokalizowane ustawienia daty danego systemu, ja myślę, że to jest coś, co i tak powinieneś zrobić. Z pewnością jesteś zmuszony to zrobić w SQL w Accessie, więc nie sądzę, że jest to zły nawyk w kodzie i wyrażeniach.

+0

Dzięki David. Zapamiętam to. –

1

Miałem ten sam problem.

Okazało tydzień 53 i tydzień 1, jeszcze dni w tygodniu 53 i 1 tygodniu są w tygodniu 1

raz pierwszy spróbował zmienić format daty w zapytaniu Dostęp do tego:

OrderWeek: Format ([OrderDate], "yyyy-ww", 1,3) < - Ale to nie wystarczyło. Otrzymujesz daty takie jak 2014-52 w tygodniu 52 i 2015-52, gdzie był to tydzień 1 wcześniej.

Również sortowanie nie było takie, jak mi się podobało. Posortowano dane na lata 2014-1, 2014-11, 2014-2 itd. Chcę, aby były wyświetlane jako 2014-01, 2014-02 .. 2014-11 itd.

Oto nowy kod do wyświetlenia zarówno rok i tydzień poprawnie w Query dostępie:

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]))) 

To teraz pokazuje żadnych dni od tygodnia 53 jako część tygodnia 1

Powiązane problemy