弄清楚最近的周年纪念日

时间:2015-08-27 15:36:04

标签: vba date ms-access access-vba

我正在写一个培训数据库。

学生有一个ServiceDate(他们开始在公司工作的那天)。

我需要了解他们去年是否从他们的ServiceDate中选择了一门课程。不是日历年,需要在周年纪念日重置某些课程......所以截止日期因每个学生而异。

我想我可以做这样的事......但我确信有一个更容易的方法:

()

有没有更简单的方法来执行此操作...或者有人看到此方法存在问题吗?使用日期有时会很痛苦......

2 个答案:

答案 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