如何解决根据周和年标准选择最新日期
我认为我有一个简单的问题,我无法解决。我有一个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
但是-如您所见-它调用了一些辅助函数,又调用了其他函数,因此在这里发布太多了。
我可以将其上传到某个地方,如果您认为这将为您提供解决方案。
没有简单的解决方法。另一方面,一旦保存在模块中,代码就很容易实现-如您所见。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。