根据周和年标准选择最新日期

问题描述

我认为我有一个简单的问题,我无法解决我有一个ID,日期和值的表格 我想根据星期和年份的标准选择最新值。意味着我只有一年和一周才能找到最新的值。

如果您执行以下操作 SELECT TOP 1 Value from tbl WHERE year(Date)<=year and format(date,"WW")<= weeknumber 你有问题。因为如果年份是2020,而星期是30。那么如果存在31/12/2019中的值,则不会返回它,因为format(date,"WW")大于星期。

示例:dateformat = dd / mm / yyyy

ID      Date     Value
1   15/01/2019    15 
2   31/12/2019    18
3   15/04/2020    19

如果星期是5,而年份是2020 sql的结果应为18,因为这是星期和年份之前的最新值。但是我上面编写的查询返回15,这是由于31/12/2019> 5的一周而发出的,因此不会返回。

但是我该怎么做呢?

解决方法

由于这可能是ISO 8601周编号,所以年份不是日历年,而是 ISO 8601年,本机VBA对此一无所知,因此需要自定义功能:

' First day of the week.
WeekStart = DateYearWeek(5,2020,vbMonday)
' WeekStart -> 2020-01-27

函数不是那么复杂:

' Returns the date of Monday for the ISO 8601 week of IsoYear and Week.
' Optionally,returns the date of any other weekday of that week.
'
' 2017-05-03. Gustav Brock,Cactus Data ApS,CPH.
'
Public Function DateYearWeek( _
    ByVal IsoWeek As Integer,_
    Optional ByVal IsoYear As Integer,_
    Optional ByVal DayOfWeek As VbDayOfWeek = VbDayOfWeek.vbMonday) _
    As Date

    Dim WeekDate    As Date
    Dim ResultDate  As Date

    If IsoYear = 0 Then
        IsoYear = Year(Date)
    End If

    ' Validate parameters.
    If Not IsWeekday(DayOfWeek) Then
        ' Don't accept invalid values for DayOfWeek.
        Err.Raise DtError.dtInvalidProcedureCallOrArgument
        Exit Function
    End If
    If Not IsWeek(IsoWeek,IsoYear) Then
        ' A valid week number must be passed.
        Err.Raise DtError.dtInvalidProcedureCallOrArgument
        Exit Function
    End If

    WeekDate = DateAdd(IntervalSetting(dtWeek),IsoWeek - 1,DateFirstWeekYear(IsoYear))
    ResultDate = DateThisWeekPrimo(WeekDate,DayOfWeek)

    DateYearWeek = ResultDate

End Function

但是-如您所见-它调用了一些辅助函数,又调用了其他函数,因此在这里发布太多了。

我可以将其上传到某个地方,如果您认为这将为您提供解决方案。

没有简单的解决方法。另一方面,一旦保存在模块中,代码就很容易实现-如您所见。