2016-01-12 40 views
2

我很驚訝我找不到任何現有的在線解決方案,但我只需要一個返回ISO標準周編號的SQL函數(即第1周的開始始終是今年的第一個星期一)。MS Access獲得ISO標準周編號

沒有一個DatePart函數選項一致返回正確的結果。我曾想過選擇「vbFirstFourDays - 從第一週開始,新年至少有四天。」但在測試好了,今天(1月12日)返回3周,沒有第2周(我的表情是DatePart("ww",Now(),2)

今年ISO本週1月4日,明年1點開始的1月2日和去年是月5日。

非常感謝

+0

嘗試'DatePart(「ww」,Now(),2,2)'。你的例子實際上是省略* firstweekofyear *參數。 –

+0

糟糕,我很傻,非常感謝,工作正常:) – Absinthe

回答

3

DatePart功能確實幾乎*正確計算ISO-8601的週數時,它使用vbMondayFirstdayofweek可參數,vbFirstFourDaysfirstweekofyear參數,例如,

DatePart("ww", Date(), vbMonday, vbFirstFourDays) 

,或者直接在Access查詢

DatePart("ww", Date(), 2, 2) 

*注意,錯誤記錄here顯然從來沒有被固定時,所以在下面的星期一21 st世紀據說在第53周時根據ISO-8601他們應該在第二年的第一週:

2003-12-29
2007-12-31
2019年12月30日
2031年12月29日
2035年12月31日
2047年12月30日
2059年12月29日
2063年12月31日
二○七五年十二月三十日
2087年12月29日
2091年12月31日

+0

訪問傳播[Oleaut23.dll錯誤](http://support.microsoft.com/kb/200299)? –

+0

不幸的是,它的確如此。我已經更新了我的答案。謝謝! –

2

剛剛從戈德湯普森,微軟遵循提供了一個解決方法,它返回正確的ISO一週在所有的電路mstances。它只是將第53周更改爲第1周。只需將其放在VBA模塊中,然後就可以在Excel/Access中使用該功能。

Public Function ISOWeek(MyDate As Date) As Integer 

     ISOWeek = Format(MyDate, "ww", vbMonday, vbFirstFourDays) 
     If ISOWeek > 52 Then 
     If Format(MyDate + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then ISOWeek = 1 
     End If 

End Function