MS Access 2010 (представление «Дизайн»): возврат в понедельник текущей недели с понедельником в качестве 1-го дня недели

Мне нужно, чтобы мой запрос Access всегда возвращал понедельник текущей недели. Я видел несколько решений в Google/StackOverflow, но они написаны на SQL, и я новичок в создании запросов доступа (для их создания я использую представление «Дизайн»).

Цель: неделя должна рассматриваться как M T W T F S S. Тогда запрос всегда должен возвращать понедельник текущей недели. Следовательно, если сейчас воскресенье, он все равно должен возвращать предыдущий понедельник, НЕ понедельник следующей недели. Кто-нибудь может объяснить, как это сделать с помощью представления «Дизайн» в Access 2010?


person whatwhatwhat    schedule 27.04.2015    source источник
comment
Это работает для вас? Date() - (DatePart("w", Date(), 2, 1)-1) .. Вы можете вставить это в столбец Field в представлении конструктора запросов. Если это работает для вас, я могу дать объяснение.   -  person Mark C.    schedule 27.04.2015
comment
@Invent-Animate сработало! Я хотел бы знать, почему. Давай, напиши это как ответ, чтобы я мог поставить зеленую галочку!   -  person whatwhatwhat    schedule 27.04.2015
comment
comment
@krish, который очень хорошо объяснил синтаксис, спасибо!   -  person whatwhatwhat    schedule 27.04.2015


Ответы (2)


Имейте в виду, что в этом контексте мы работаем с датами, поэтому, если мы выполним Date() - 1, мы получим 1 день до сегодняшнего дня.

Date() ~ Сегодняшняя дата

DatePart(
        "w" - Weekday
        Date() - Today's date
        2 - vBMonday (Access assumes Sunday is the first day of the week, which is why this is necessary.)
        1 - vbFirstJan1 - This gets into using the first week of the year. We could have omitted this, as 1 is the default.
)

-1 - Subtract 1 from the DatePart value.

Ценности

Date() = 4/27/2015 (at time of this writing)
DatePart("w",Date(),2,1) = 1
DatePart("w",Date(),2,1)-1 = 0

Итак, у нас есть Date()-0... Хорошо, что в этом такого замечательного? Что ж, давайте рассмотрим более полезный сценарий, в котором сегодняшняя дата — это день, отличный от понедельника.

Давайте действовать так, как будто сегодня 28.04.2015 (вторник)

Date() = 4/28/2015
DatePart("w",Date(),2,1) = 2
DatePart("w",Date(),2,1)-1 = 1

Итак, снаружи, внутри; дайте мне текущее значение дня недели. (1 = понедельник, 2 = вторник и т. д.) и вычтите из этого 1 -> столько дней нам нужно вычесть из текущей даты, чтобы вернуться к значению weekday, равному 1 (понедельник).

person Mark C.    schedule 27.04.2015
comment
Вау, теперь это имеет столько смысла!! Спасибо за ваше время!! - person whatwhatwhat; 27.04.2015
comment
Нет проблем, рад, что смог помочь. - person Mark C.; 27.04.2015

Вот функция, которая сделает это:

Public Function DatePrevWeekday( _
  ByVal datDate As Date, _
  Optional ByVal bytWeekday As VbDayOfWeek = vbMonday) _
  As Date

' Returns the date of the previous weekday, as spelled in vbXxxxday, prior to datDate.
' 2000-09-06. Cactus Data ApS.

  ' No special error handling.
  On Error Resume Next

  DatePrevWeekday = DateAdd("d", 1 - Weekday(datDate, bytWeekday), datDate)

End Function

Поскольку vbMonday равно 2, а ваша дата сегодня, вы можете использовать основное выражение в запросе:

PreviousMonday: DateAdd("d",1-Weekday(Date(),2),Date())
person Gustav    schedule 27.04.2015