2011-10-05 3 views
1

결과를 월별 일로 나누는 DateDiff와 비슷한 쿼리/vba 함수를 어떻게 만들 수 있습니까? (즉, 2010 년 1 월 1 일 - 2010 년 2 월 3 일 = 1 월 31 일, 2 월 : 3 (서식 지정 무시)).DateDiff를 월로 나누기 access/vba

+0

각 결과에는 날짜 범위를 나타내는 두 개의 날짜 열이 있으며 각 결과에 매월 일 수를 표시 하시겠습니까? – Banjoe

+0

입력에는 두 개의 날짜 열이 있습니다. 결과는 모두 12 개월이며 각 날의 일수가됩니다. (12 개월 간의 DateDiff 분할). –

+0

그렇지 않은 경우 현재 월의 지난 12 개월을 계산해야합니다 (이 달의 경우 10 월, 오늘부터 10 년 사이의 날짜를 지난 연도의 11 월 초에서 오늘까지 계산 함) . –

답변

1

좋아요, 당신이하고 싶은 것을 보았습니다.

우선 월과 일이 주어진 월의 일 수를 반환하는 함수가 필요합니다 (윤년으로 인해 2 월의 일수가 변경되는 것을 알 필요가 있습니다) :

Function DaysInMonth(month As Integer, year As Integer) As Integer 

    If month < 1 Or month > 12 Then 
     DaysInMonth = -1 
    Else 
     DaysInMonth = Day(DateSerial(year, month + 1, 1) - 1) 
    End If 

End Function 
내가 함수를 GetMonthDays 지정된 시작 및 종료 날짜 사이에 각 월의 일 수를 포함하는 정수의 배열 (1 ~ 12)을 시작 날짜와 종료 날짜를 받아 반환를 작성했습니다

. 시작일과 종료일은 수시로 다를 수 있으며 필요한 경우 여러 해 동안의 각 달의 총 일수를 누적합니다.

예를 들면,이 함수 호출 등 :

Dim months() As Integer 
months = GetMonthDays(#6/13/2011#, #8/1/2011#) 

는 반환 배열 [00000183110000]

호출과 같은 : 여러 년 동안

months = GetMonthDays(#12/25/2010#, #1/15/2011#) 

반환 [15,0000000000,7]

에 대한 예 :

,
months = GetMonthDays(#12/25/2009#, #1/15/2011#) 

그것은 반환 [46,28,31,3031303131303130,38]

당신은 그것에서 일 수를 축적하고 있음을 알 수 2 월 1 일 (31 + 15)과 2 명의 죽음의 자 (31 + 7). 나는 이것이 당신이 원하는 것이라는 것을 100 % 확신하지는 못하지만, 12 개월이 넘는 날짜 범위가 주어지면 나에게 의미가 있습니다.

기본적으로이 함수는 시작 날짜와 종료 날짜 사이의 각 월을 반복하고 각 날짜를 누적합니다. 첫 번째와 마지막 달은 약간의 계산이 필요한 특수한 경우이며, 그렇지 않으면 단순히 그 달의 일 수입니다.

기능은 다음과 같습니다 뺀 오류 검사 : 나는 같은 기능을 사용하여 테스트했습니다

Function GetMonthDays(startDate As Date, endDate As Date) As Integer() 

    Dim months(1 To 12) As Integer 
    Dim monthStart As Integer 
    Dim monthEnd As Integer 
    Dim yearStart As Integer 
    Dim yearEnd As Integer 
    Dim monthLoop As Integer 
    Dim yearLoop As Integer 

    ' initialise months array to all zeros 

    For monthLoop = 1 To 12 
     months(monthLoop) = 0 
    Next monthLoop 

    monthStart = month(startDate) 
    monthEnd = month(endDate) 
    yearStart = year(startDate) 
    yearEnd = year(endDate) 

    monthLoop = monthStart 
    yearLoop = yearStart 

    Do Until yearLoop >= yearEnd And monthLoop > monthEnd 

     If yearLoop = yearStart And monthLoop = monthStart Then 
      months(monthLoop) = months(monthLoop) + (DaysInMonth(monthLoop, yearLoop) - Day(startDate) + 1) 
     ElseIf yearLoop = yearEnd And monthLoop = monthEnd Then 
      months(monthLoop) = months(monthLoop) + Day(endDate) 
     Else 
      months(monthLoop) = months(monthLoop) + DaysInMonth(monthLoop, yearLoop) 
     End If 

     If monthLoop < 12 Or (monthLoop = 12 And yearLoop = yearEnd) Then 
      monthLoop = monthLoop + 1 
     Else 
      monthLoop = 1 
      yearLoop = yearLoop + 1 
     End If 

    Loop 

    GetMonthDays = months 

End Function 

:

Sub TestRun() 

    Dim months() As Integer 

    months = GetMonthDays(#12/25/2009#, #1/15/2011#) 

    MsgBox _ 
     months(1) & vbCrLf & _ 
     months(2) & vbCrLf & _ 
     months(3) & vbCrLf & _ 
     months(4) & vbCrLf & _ 
     months(5) & vbCrLf & _ 
     months(6) & vbCrLf & _ 
     months(7) & vbCrLf & _ 
     months(8) & vbCrLf & _ 
     months(9) & vbCrLf & _ 
     months(10) & vbCrLf & _ 
     months(11) & vbCrLf & _ 
     months(12) 

End Sub 

이것은 당신을위한 좋은 시작점이 있어야한다 적어도. 행운을 빕니다!

+0

편집 : 종료일이 12 월 인 경우 오류를 수정하려면 사소한 변경. –

+0

비슷한 기능을 필요로하는 다른 사용자의 경우 동일한 요일 (# 11/5/2011 #, # 11/20/2011 # returns 26) 일 경우 위의 기능이 실패 할 수 있습니다. –