Самый простой способ ВЫБРАТЬ * ИЗ MyTable, ГДЕ mydate находится в определенном номере недели? - PullRequest
0 голосов
/ 20 октября 2019

Есть ли простой способ выбора и суммирования строк, в которых дата находится в определенном номере недели?

Что-то вроде этого кода?

mysum = RS.execute("Select Sum(mypoints) as sumpoints from MyTable WHERE 
  datepart(week, mydate) = '42'")("sumpoints")

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Правильный синтаксис для оператора SQL и функции DatePart () - используется первый день недели воскресенья по умолчанию:

SELECT Sum(mypoints) AS sumpoints FROM MyTable WHERE DatePart("ww", mydate) = 42

0 голосов
/ 21 октября 2019

Поскольку у вас, вероятно, понедельник в качестве первого дня недели, это будет:

Select Sum(mypoints) As sumpoints 
From MyTable 
Where DatePart('ww', mydate, 2) = 42

Однако, если вам нужна точная ISO 8601 неделянумерации, вам придется использовать пользовательские функции, такие как:

Public Function ISO_WeekNumber( _
  ByVal datDate As Date) _
  As Byte

' Calculates and returns week number for date datDate according to the ISO 8601:1988 standard.
' 1998-2000, Gustav Brock, Cactus Data ApS, CPH.
' May be freely used and distributed.

  Const cbytFirstWeekOfAnyYear  As Byte = 1
  Const cbytLastWeekOfLeapYear  As Byte = 53

  Dim bytWeek                   As Byte
  Dim bytISOThursday            As Byte
  Dim datLastDayOfYear          As Date

  bytWeek = DatePart("ww", datDate, vbMonday, vbFirstFourDays)

  If bytWeek = cbytLastWeekOfLeapYear Then
    bytISOThursday = Weekday(vbThursday, vbMonday)
    datLastDayOfYear = DateSerial(Year(datDate), 12, 31)
    If Weekday(datLastDayOfYear, vbMonday) >= bytISOThursday Then
      ' OK, week count of 53 is caused by leap year.
    Else
      ' Correct for Access97/2000 bug.
      bytWeek = cbytFirstWeekOfAnyYear
    End If
  End If

  ISO_WeekNumber = bytWeek

End Function

для замены DatePart .

Обратите внимание, что вам также придется фильтровать нагод, поскольку номера недели 1 и 52/53 ИСО обычно пересекают границы календарного года.

Приложение :

Это версия VBScript в случае VBA версия (выше) не может быть использована:

Option Explicit

MsgBox ISO_WeekNumber(Date)

WScript.Quit


Function ISO_WeekNumber(ByVal Date1)

' Calculates and returns week number for date Date1 according to the ISO 8601:1988 standard.
' 2019, Gustav Brock, Cactus Data ApS, CPH.
' May be freely used and distributed.

  Const FirstWeekOfAnyYear = 1
  Const LastWeekOfLeapYear = 53

  Dim Week
  Dim ISOThursday
  Dim LastDayOfYear

  Week = DatePart("ww", Date1, vbMonday, vbFirstFourDays)

  If Week = LastWeekOfLeapYear Then
    ISOThursday = Weekday(vbThursday, vbMonday)
    LastDayOfYear = DateSerial(Year(Date1), 12, 31)
    If Weekday(LastDayOfYear, vbMonday) >= ISOThursday Then
      ' OK, week count of 53 is caused by leap year.
    Else
      ' Correct for VBA bug.
      Week = FirstWeekOfAnyYear
    End If
  End If

  ISO_WeekNumber = Week

End Function
...