2016-06-21 3 views
0

В настоящее время я работаю над базой данных, в которой хранятся данные о лицензировании программного обеспечения, такие как имя программного обеспечения, дата покупки, стоимость, количество и т. Д. После того, как программное обеспечение принадлежит в течение 12 месяцев мы должны заплатить сбор за обслуживание.Поиск следующего вхождения данной даты с запросом MS Access

Мой вопрос заключается в том, как спроектировать запрос, который займет дату покупки, и вычислить следующее вхождение этой даты, которое будет храниться в поле даты обслуживания. Пример) Если лицензия была приобретена 31.12.1999 года, мне необходимо будет оплатить обслуживание на 12/31/2016.

У меня нет большого опыта работы с MS Access или SQL-запросами, и после изучения этого на некоторое время я даже не уверен, что это возможно. Я был бы признателен за любую помощь, которую вы, ребята, могли бы мне дать!

+0

Посмотрите на [DateAdd()] (http://www.techonthenet.com/access/functions/date/dateadd.php) доступны в Access SQL и VBA, что позволяет добавлять через много временных интервалов (день, неделя, месяц, год). – Parfait

+0

Будет, спасибо за подсказку! – Jared

+0

Это было именно то, что мне нужно, спасибо! – Jared

ответ

1

Вот функция, которая будет делать именно это:

Public Function DateNextAnnualDay(_ 
    ByVal AnnualDay As Date) _ 
    As Date 

    Dim SomeDate  As Date 
    Dim NextAnnualDay As Date 
    Dim Years   As Integer 

    SomeDate = Date 

    NextAnnualDay = AnnualDay 
    Years = DateDiff("yyyy", AnnualDay, SomeDate) 
    If Years < 0 Then 
     ' Don't calculate hypothetical annual days. 
    Else 
     NextAnnualDay = DateAdd("yyyy", Years, AnnualDay) 
     If DateDiff("d", SomeDate, NextAnnualDay) <= 0 Then 
      ' Next annual day falls earlier in the year than SomeDate. 
      NextAnnualDay = DateAdd("yyyy", Years + 1, AnnualDay) 
     End If 
    End If 

    DateNextAnnualDay = NextAnnualDay 

End Function 
0

Синтаксис

SELECT DateAdd("yyyy",1,[MyDate]) AS MaintDate 
FROM Table; 
0

Если вам нужно сделать более сложный запрос вы можете написать функцию в модуле, а затем получить доступ к нему в запросе с помощью VBA. Например, вы можете перебирать через петлю, чтобы соответствовать условию

Function GetNextDate(ByVal dteOriginalDate As Date) As Date 

While dteOriginalDate <= DateTime.Now 

    dteOriginalDate = DateAdd("Yyyy", 1, dteOriginalDate) 

Wend 

GetNextDate = dteOriginalDate 

End Function 

Будет итерацию добавление одного года с даты первоначального до точки, в которой дата в будущем. Вы можете построить его в запросе (используя щелчок правой кнопкой мыши -> сборка), чтобы каждая строка проходила через ваш код и применяла логику.

Это позволит вам сохранить исходную дату лицензии в вашей базе данных и рассчитать следующую дату выполнения, не зная (или изменить) промежуточные годы.

+0

Это работает, спасибо за помощь! – Jared