我正在写一个培训数据库。
学生有一个ServiceDate(他们开始在公司工作的那天)。
我需要了解他们去年是否从他们的ServiceDate中选择了一门课程。不是日历年,需要在周年纪念日重置某些课程......所以截止日期因每个学生而异。
我想我可以做这样的事......但我确信有一个更容易的方法:
()
有没有更简单的方法来执行此操作...或者有人看到此方法存在问题吗?使用日期有时会很痛苦......
答案 0 :(得分:3)
我不确定我到底知道你想要什么,但我怀疑DateSerial
可能有用。
Public Function LastAnniversaryDate(ByVal pServiceDate As Date) As Date
Dim dteThisYear As Date
Dim dteReturn As Date
dteThisYear = DateSerial(Year(Date), Month(pServiceDate), Day(pServiceDate))
If dteThisYear > Date Then
dteReturn = DateAdd("yyyy", -1, dteThisYear)
Else
dteReturn = dteThisYear
End If
LastAnniversaryDate = dteReturn
End Function
闰年被提及是一种可能的并发症。 DateSerial
可以按照您的意愿应对。例如,由于2015年不是闰年,DateSerial(2015, 2, 29)
将返回 3/1/2015 。这意味着LastAnniversaryDate(#2/29/2012#)
将为您提供 3/1/2015 。
如果您希望将2月28日作为2月29日服务日期的周年日期,则您需要修改此功能。
答案 1 :(得分:1)
此方法可能稍微准确一些。不确定它是否更快,但它应该有助于避免闰年问题。 (除非原始服务日期是闰年..那么您将不得不增加或减去一天。)
If (DatePart("m", ServiceDate) = 2 And DatePart("d", ServiceDate) = 29) Then
ServiceDate = DateAdd("d", -1, ServiceDate)
End If
dMostRecent = DatePart("m", ServiceDate) & "-" & DatePart("m", ServiceDate) & "-" & DatePart("yyyy", Date)
If dMostRecent > Date Then
dMostRecent = DateAdd("yyyy", -1, dMostRecent)
End If