2016-01-12 6 views
2

Я удивлен, что я не могу найти какие-либо существующие решения для этого онлайн, но мне просто нужна функция SQL, которая возвращает стандартный номер недели ISO (т.е. начало недели 1 всегда первый понедельник года).MS Access получить ISO номер недели недели

Ни один из параметров функции DatePart не возвращает правильный результат. Я подумал, что вариант «vbFirstFourDays - начните с первой недели, в которой будет не менее четырех дней в новом году». но тестирование на сегодняшний день (12 января) возвращает неделю 3, а не вторую неделю (мое выражение DatePart("ww",Now(),2))

В этом году ИСО неделя 1 начинается 4 января, в следующем году 2 января и в прошлом году это было 5 января .

Большое спасибо

+0

Попробуйте 'DatePart (« ww », Now(), 2,2)'. В вашем примере фактически отсутствовал аргумент * firstweekofyear *. –

+0

Упс, глупо меня, спасибо много, отлично работает :) – Absinthe

ответ

3

функция DatePart действительно вычислить ISO-8601 номер недели почти * правильно, когда он использует vbMonday для аргумента firstdayofweek и vbFirstFourDays для firstweekofyear аргумент, например,

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

или, при использовании непосредственно в запросе Access

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

* Обратите внимание, что ошибка документированной here не по-видимому, не было зафиксировано, поэтому следующие понедельники в 21 st век сообщается как находящийся на неделе 53, когда согласно ISO-8601 они должны быть на 1-й неделе следующего года:

2003-12-29
2007-12-31
2019-12-30
2031-12-29
2035-12-31
2047-12-30
2059-12-29
2063-12-31
2075-12-30
2087-12-29
2091-12-31

+0

Имеет ли доступ распространение [ошибка Oleaut23.dll] (http://support.microsoft.com/kb/200299)? –

+0

К сожалению, да. Я обновил свой ответ. Благодаря! –

2

Просто следовать дальше от Горд Томпсон, Microsoft предоставили обходной путь, который возвращает правильную неделю 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 
Смежные вопросы