Получить номер недели с указанной даты - PullRequest
9 голосов
/ 30 октября 2009

Примеры:

'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") возвращает 6.

Итак, как мне получить правильный результат?

Ответы [ 7 ]

25 голосов
/ 30 октября 2009

Здесь делают две вещи, которые не соответствуют вашим ожиданиям, я думаю: Предполагая, что вы хотите, чтобы неделя с 1 января была первой, а воскресенье - первым днем ​​недели. Таким образом, у него 1 неделя с воскресенья 28 декабря 2008 года по субботу 3 января 2009 года.

Неделя 6 начинается в воскресенье, 1 февраля, по этому методу.

Стандарт ISO для недели 1 - это тот, который содержит 4 дня января или первый четверг года (различные способы выразить одно и то же). Вы можете указать этот метод расчета и первый день недели:

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

см. Здесь для синтаксиса:

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

5 голосов
/ 31 октября 2009

Независимо от того, в какой день недели ваша неделя начинается, вам нужно передавать однозначные значения даты. «31/1/2009» может быть только одной датой (31 января), но «1/2/2009» может быть 2 января (по американскому стилю) или 1 февраля (всем, кто имеет больше смысла, чем мы, американцы).

В этом случае я бы использовал DateSerial (), чтобы убедиться, что дата не интерпретирована неверно:

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

Хотя это не вызывает вашей проблемы, потому что Access полезно использует локализованные настройки даты вашей системы, но я думаю, что это то, что вы должны сделать в любом случае. Вы, конечно, вынуждены делать это в SQL в Access, поэтому я не думаю, что это плохая привычка в коде и выражениях.

5 голосов
/ 30 октября 2009

Это может работать: формат (YourDate, "ww", vbMonday)

2 голосов
/ 30 октября 2009

«Правильный результат» зависит от локали. Возможно, VBA позволит вам выбрать систему календаря, иначе вам не повезло.

Обратите внимание, что First-Day-On-xxDay - не единственная ваша проблема. Существует также различие в том, что такое полная неделя, поэтому Неделя 1 в одной системе может быть Неделя 53 предыдущего года в другой системе.

Так что проверяйте тщательно и не поддавайтесь соблазну "исправить на 1".

1 голос
/ 14 января 2015

У меня была такая же проблема.

На ней показаны 53-я неделя и 1-я неделя, а все дни в 53-й и 1-й неделях - в 1-й неделе

Сначала я попытался изменить формат даты в запросе на доступ к этому:

OrderWeek: Format ([OrderDate], "yyyy-ww", 1,3) <- Но это не сработало. Вы получаете даты, например, 2014-52 гг. Для 52-й недели и 2015-52 гг., Где раньше была неделя 1. </p>

Кроме того, сортировка была не так, как мне понравилось. Данные отсортированы как 2014-1, 2014-11, 2014-2 и т. Д. Я хочу, чтобы они отображались как 2014-01, 2014-02 .. 2014-11 и т. Д.

Итак, вот новый код для правильного отображения года и недели в запросе на доступ:

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

Теперь отображаются дни недели 53 как часть недели 1

1 голос
/ 30 октября 2009

Существует целый стандарт для недельных номеров: ISO-8601

http://en.wikipedia.org/wiki/ISO_8601#Week_dates

0 голосов
/ 30 октября 2009

Если воскресенье - первый день недели (как в некоторых регионах), то 6 - правильный номер недели для «1/2/2009» (1 февраля 2009 г.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...